



全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
在最近的一个Smart Client项目中,为了演示异步操作的实现,写了一个基于BackgorundWorker的例子。由于这个理基本上实现了BackgorundWorker的大部分功能:异步操作的启动、操作结束后的回调、异步操作的撤销与进度报告等等。尽管没有太多的技术含量,姑且放上来与大家分享。1、场景描述下面是程序运行时的截图。本程序模拟这样的一个场景:有两组相互独立的数据需要逐条获取与显示,左边与右边两个groupbox分别代表基于这两组数据的操作,由于他们完全独立,因此可以并行执行。当点击Start按钮,以异步的方式从存储介质中逐条获取数据,并将获取的数据追加到对应的ListBox中,ProgressBar真实反映以获取的数据条数与总记录条数的百分比,同时,当前获取的条数也会在下方的Label上随着操作的继续而动态变化。此外通过点击Stop按钮,可以中止掉当前的操作。当操作被中止后,ProgressBar与Label反映中止的那一刻的状态。 2、代码实现由于界面上左右两边是两个互不干扰、相互独立的操作,所以分别创建了两个BackgroundWorker组件来负责(如下图:backgroundWorkerLeft与backgroundWorkerRight)。 将两个BackgroundWorker的WorkerReportsProgress与WorkerSupportsCancellation设为true。 我们假设获取的记录数固定,我们为此定义一个常量:private static int MaxRecords = 100;下面是左边Start按钮的Click event handler:private void buttonStartLeft_Click(object sender, EventArgs e) if (this.backgroundWorkerLeft.IsBusy) return; this.listBoxLeft.Items.Clear(); this.backgroundWorkerLeft.RunWorkerAsync(MaxRecords); this.buttonStartLeft.Enabled = false; this.buttonCacnelLeft.Enabled = true; 当Start按钮被点击后,RunWorkerAsync方法被掉调用,我们定义的常量(MaxRecords )当作参数被掺入。随后,将会触发其DoWork事件,Dowork event handler处理代码如下:private void backgroundWorkerLeft_DoWork(object sender, DoWorkEventArgs e) try e.Result = this.RetrieveData(this.backgroundWorkerLeft, e); catch (Exception ex) MessageBox.Show(ex.Message); throw; 调用RetrieveData方法逐条获取数据。注意该方法的两个参数:BackgroundWorker与DoWorkEventArgs 对象,返回值是返回数据的数量。由于在buttonStartLeft_Click中,我们将常量MaxRecords 作为参数传入了BackgroundWorker的RunWorkerAsync方法, 此时的e.Argument = MaxRecords。之所以要将这两个参数传入RetrieveData()方法,是因为该方法是为两个BackgroundWorker服务的,需要通过参数来区别当前是哪个BackgroundWorker。我们再来看看RetrieveData方法的定义:private int RetrieveData(BackgroundWorker worker, DoWorkEventArgs e) int maxRecords = (int)e.Argument; int percent = 0; for (int i = 1; i = maxRecords; i+) if (worker.CancellationPending) return i; percent = (int)(double)i / (double)maxRecords) * 100); worker.ReportProgress(percent, new KeyValuePair(i,Guid.NewGuid().ToString(); Thread.Sleep(100); return maxRecords; 通过e.Argument,获得最大数据获取量之后,进行一个for循环,在每次迭代中,如何worker.CancellationPending=true,代表异步操作被显示取消,则直接返回;否则,调用BackgroundWorker的ReportProgress方法。ReportProgress具有两个重载:public void ReportProgress(int percentProgress); public void ReportProgress(int percentProgress, object userState); percentProgress代表当前进度,从0-100。userState便于传入一些额外的参数。在界面上,由于数据的当前数量需要实时地显示,而记录也是现取现加(取出一条就在ListBox上追加)。所以制定一个KeyValuePair对象作为第二个参数。其中Key为当前记录数,Value是一个Guid,代表取出的数据。ReportProgress的调用将会导致ProgressChanged事件被触发。ProgressChanged event handler用于显示当前进度、当前记录数量与显示获取的纪录:private void backgroundWorkerLeft_ProgressChanged(object sender, ProgressChangedEventArgs e) KeyValuePair record = (KeyValuePair) e.UserState ; this.labelResultLeft.Text = string.Format(There are 0 records retrieved!, record.Key); gressBarLeft.Value = e.ProgressPercentage; this.listBoxLeft.Items.Add(record.Value);注:这些操作需要操作UI上的控件,只能在Main Thread中进行。如何在RetrieveData方法进行的话,由于该方式是一个异步方法,是会抛出异常的。 由于操作的时间可能无法预知,在长时间不能完全获取数据的情况下,用户可以需要手工结束掉当前的操作。这个操作实现在Stop按钮的Click事件中:private void buttonCacnelLeft_Click(object sender, EventArgs e) this.backgroundWorkerLeft.CancelAsync(); 如何操作正常地结束,BackgroundWorker的RunWorkerCompleted会被触发,下面是RunWorkerCompleted event handler的定义:private void backgroundWorkerLeft_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) try this.labelResultLeft.Text = string.Format(Total records: 0, e.Result); this.buttonStartLeft.Enabled = true; this.buttonCacnelLeft.Enabled = false; catch (TargetInvocationException ex) Me
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 咨询顾问的项目方案
- 乡镇流动人口管理制度
- 2025-2030高端冰箱食材管理智能化技术专利布局竞争图谱
- 蜡染亲子活动策划方案
- 写字楼租赁合同范本及注意点
- 服务器维护日常检查流程
- 本单元复习与测试说课稿-2025-2026学年小学信息技术(信息科技)第二册粤教版(李师贤主编)
- 小学五年级几何体积计算训练题
- 人民版高中历史必修二3.1《社会主义建设在探索中曲折发展》教学设计
- 创业公司股东权益保护协议范本
- 2023版国家关于轻伤、重伤鉴定新标准(人体损伤程度鉴定标准)
- 《挥发性有机污染地块现场分析检测技术验证评价指南》
- 护理质控鱼骨头制作流程
- 《人工智能发展史》课件
- 软件产品授权与支持合同
- 2023年国家教育行政学院招聘笔试真题
- 快递设备安全培训
- 家具安装调试及施工进度保障措施
- 2024制冷系统管路结构设计指导书
- 《春》课后习题参考答案
- 品酒师(黄酒)理论知识考核要素细目表四级
评论
0/150
提交评论