



全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
WinForm中异步加载数据并使用进度条在WinForm程序中,有时会因为加载大量数据导致UI界面假死,这种情况对于用户来说是非常不友好的。因此,在加载大量数据的情况下,首先应该将数据加载放在另一线程中进行,这样保证了UI界面的响应;其次可以提供一个进度条使用户明白程序正在加载数据,同时清楚知道目前加载的进度。实现上述功能的一个简单的方式是利用System.ComponentModel中的工具类:BackgroundWorker,它支持取消,进度报告,异常转发,并且实现了IComponent接口,意味着可以直接在VS设计器中从工具箱中拖到界面上使用。下面以一个例子来说明如何使用BackgroundWorker,更详细的BackgroundWorker说明可以参考Threading in C#(或者中文翻译):1. UI界面添加一个进度条,一个开始按钮,一个结束按钮,以及BackgroundWorker,并设置下列BackgroundWorker属性(例子中设置了其Name为bw): WorkerReportsProcess:默认为False,将其设置为True,支持进度报告 WorkerSupportsCancellation:默认为False,将其设置为True,支持取消2. DoWork事件,在其中执行我们的数据加载,我们执行一个循环来模拟数据加载private void bw_DoWork(object sender, DoWorkEventArgs e) var count = (int)e.Argument; for (int i = 1; i = count; i+) if (bw.CancellationPending) e.Cancel = true; return; bw.ReportProgress(i); Thread.Sleep(200); / 模拟耗时的任务 注意:在这个方法中不能进行UI控件的更新。 通过检查CancellationPending来判断用户是否进行了取消 通过调用ReportProgress来报告进度3.ProgressChanged事件,在这里可以操作进度条,以及其他UI控件。private void bw_ProgressChanged(object sender, ProgressChangedEventArgs e) progressBar.Value = e.ProgressPercentage; resultTextBox.Text += DateTime.Now + rn;通过e.ProgressPercentage来获取任务执行过程中设置的进度,以此来更新进度条。4.RunWorkerCompleted事件,在这里可以更新UI,以及进行异常处理。private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) if (e.Cancelled) resultTextBox.Text += 任务取消。 + rn; else if (e.Error != null) resultTextBox.Text += 出现异常: + e.Error + rn; else resultTextBox.Text += 任务完成。 + rn;当执行过程中出现异常时,异常会被转发到这里,因此可以在这里处理异常。5. 通过一个开始按钮调和一个取消按钮来控制: bw.RunWorkerAsync() 启动 bw.CancelAsync() 取消下边是完整的代码及输出:public partial class Form1 : Form public Form1() InitializeComponent(); bw.DoWork += bw_DoWork; bw.ProgressChanged += bw_ProgressChanged; bw.RunWorkerCompleted += bw_RunWorkerCompleted; private void startButton_Click(object sender, EventArgs e) progressBar.Value = 0; progressBar.Maximum = 10; resultTextBox.Text = 任务开始. + rn; bw.RunWorkerAsync(10); private void bw_DoWork(object sender, DoWorkEventArgs e) var count = (int)e.Argument; for (int i = 1; i = count; i+) if (bw.CancellationPending) e.Cancel = true; return; if (i = 2) throw new Exception(出错啦!); bw.ReportProgress(i); Thread.Sleep(200); private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) if (e.Cancelled) resultTextBox.Text += 任务取消。 + rn; else if (e.Error != null) resultTextBox.Text += 出现异常: + e.Error + rn; else resultTextBox.Text += 任务完成。 + rn; private void bw_ProgressChanged(object sender, ProgressChangedEventArgs e) progressBar.Value = e.ProgressPercen
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025内蒙古巴彦淖尔市临河区第三人民医院招聘部分人员3人模拟试卷及答案详解(典优)
- 2025广东韶关市新丰县应急管理局招聘综合应急救援大队队员5人考前自测高频考点模拟试题及参考答案详解
- 2025安徽蚌埠市五河县乡村医生“乡聘村用”招聘30人模拟试卷完整答案详解
- 2025广西百色市凌云县新活力劳务有限责任公司工作人员招聘8人模拟试卷及答案详解(必刷)
- 2025年莆田市市级机关公开遴选考试真题
- 2025年长江工程职业技术学院人才引进24人模拟试卷及参考答案详解
- 2025年甘肃省武威市事业单位招聘628人【医疗岗57人】考前自测高频考点模拟试题及一套参考答案详解
- 2025年浸渗胶项目合作计划书
- 2025贵州遵义医科大学第二附属医院第十三届贵州人才博览会引才17人模拟试卷及答案详解参考
- 2025贵州贵阳市某单位派遣制员工模拟试卷附答案详解(完整版)
- 眉山市发展和改革委员会市项目工作推进中心公开选调事业人员的考试参考题库及答案解析
- 遗传咨询考试题库及答案
- 2025湖南能源集团电投公司社招39人笔试模拟试题及答案解析
- 与生育相关的慢性子宫内膜炎诊治专家共识(2025年版)解读
- 吉林省吉林市第四中学校2024-2025学年高一上学期9月第一次月考生物学试卷(含答案)
- 【益模科技】2025汽车零部件行业数字化转型白皮书
- 2024年齐齐哈尔医学院公开招聘辅导员笔试题含答案
- 三轮车驾培考试题库及答案
- 港口码头安全培训知识课件
- 2025年中国行政史试题及答案
- 2024义务教育科学新课标课程标准考试真题及答案
评论
0/150
提交评论