异步编程:基于事件的异步编程模式(EMP)
作者:网络转载 发布时间:[ 2013/4/7 10:23:29 ] 推荐标签:
3、BackgroundWorker示例
示例代码中包含了BackgroundWorker源代码及对应的使用示例,这里不粘贴代码了,会导致篇幅更大。来个示例截图吧:
示例分析:
1)首先我们为BackgroundWorker组件注册DoWork(异步操作)、ProgressChanged(进度报告) 和RunWorkCompleted(完成通知)事件;
2)设置WorkerSupportsCancellation和WorkerReportsProgress属性为true,以声明组件支持取消操作和进度报告;
3)使用RunWorkerAsync() 开启异步操作,通过IsBusy属性判断是否已经有异步任务在执行;
4)使用CancelAsync() 方法取消异步操作,但要注意:
a)它仅仅是将BackgroudWorker.CancellationPending属性设置为true。需要在具体DoWork事件中不断检查BackgroudWorker.CancellationPending来设置DoWorkEventArgs的Cancel属性。
b)DoWork事件处理程序中的代码有可能在发出取消请求时完成其工作,轮询循环可能会错过设置为 true 的CancellationPending属性。在这种情况下,即使发出了取消请求,RunWorkerCompleted事件处理程序中RunWorkerCompletedEventArgs的 Cancelled 标志也不会设置为 true。这种情况被称作争用状态。(可以通过直接监控组件的CancellationPending属性,来做判断)
5)确保在DoWork事件处理程序中不操作任何用户界面对象。而应该通过ProgressChanged和RunWorkerCompleted事件与用户界面进行通信。
因为RunWorkerAsync()是通过委托的BeginInvoke()引发的DoWork事件,即DoWork事件的执行线程已不是创建控件的线程。而ProgressChanged和RunWorkerCompleted事件是通过帮助器类AsyncOperation的 Post() 方法使其调用发生在合适的“线程或上下文”中。
自定义基于事件的异步组件
刚才我们介绍了BackgroundWorker组件,但是这个组件在一个时刻只能开启一个异步操作,那如果我们要想同时支持多个异步操作、进度报告、增量结果、取消和返回结果值或异常信息该怎么办呢?对的,我们可以为自己定义一个基于事件的异步组件。
我直接引用MSDN上的一则计算质数的异步组件示例,请从我提供的示例代码中获取。
质数算法:埃拉托色尼筛法
eg:判断n是否为质数
1、1和0既非素数也非合数;
2、将2和3加入质数集合primes;从n=5开始,通过 n+=2 来跳过所有偶数;
3、循环集合primes中的质数并将其做为n的因子,能整除的为合数;
4、若不能整除,则继续循步骤3直到“因子的平方>n”,即可判断n为质数,并将其加入到集合primes。
来个示例截图吧:
示例分析:(组件名:PrimeNumberCalculator)
1、首先我们为PrimeNumberCalculator组件注册ProgressChanged(进度报告)和CalculatePrimeCompleted(完成通知)事件;
2、使用CalculatePrimeAsync(intnumberToTest, object taskId)开启异步任务,注意我们需要传递一个标识Guid taskId = Guid.NewGuid();用于标识取消的操作,并传递给CompletedEventArgs和ProgressChangedEventArgs参数的UserState属性来标识当前引发进度或完成事件的特定异步任务;
3、取消操作CancelAsync(object taskId),只是将taskId对应的AsyncOperation实例移除内部任务集合,耗时操作通过判断taskId是否存在于集合来判断其是否被取消;
此文到此结束,通过此博文我们认识到:
1)基于事件的异步编程是通过AsyncOperationManager类和AsyncOperation类两个帮助器类确保你的异步操作支持在各种应用程序模型(包括 ASP.NET、控制台应用程序和 Windows 窗体应用程序)的适当“线程或上下文”调用访问控件;
2)BackgroundWorker组件构建、使用和缺点。
3)展现如何构建一个基于事件的异步组件,并且支持多个异步操作的并行运行
感谢大家的观赏,如本文对你有帮助还请多帮推荐支持下……
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11