浅谈.NET下的多线程和并行计算(十一).NET异步编程模型基础 下
上次我们说了,要进行多线程编程,我们可以使用最原始的方式也是最灵活的方式进行,那就是 Thread(ThreadPool)+信号量+ 锁+Control.Invoke。.NET的异步编程模型给我们提供了一种基于 IAsyncResult的编程模式,它尤其适用于处理下面的应用场景: 1) 被阻止,正在等待一个 IAsyncResult 2) 被阻止,正在等待多个 IAsyncResult 对象 3) 轮询 IAsyncResult 上的完成情形 .NET还提供了基于事件的异步编程模式,它能够提供: 1) 后台执行耗时任务(例如下载和数据库操作),但不会中断应用程序 2) 同时执行多个操作,每个操作完成时都会接到通知 下面是一个符合基于事件的异步编程模式的类:
我们看到它的操作一般提供同步和异步两种模式,异步操作提供一个完成事件,还提供了取消异步操 作的方法。对于某些更高级的组件还提供了汇报进度的功能,通过一个进度汇报事件来完成,此事件通常 将叫做 ProgressChanged 或方法名称ProgressChanged,它对应的事件处理程序会带有一个 ProgressChangedEventArgs 参数。ProgressChanged 事件的事件处理程序可以检查 ProgressChangedEventArgs.ProgressPercentage 属性来确定异步任务完成的百分比。此属性的范围是 0 到 100,可用来更新 ProgressBar 的 Value 属性。 说到这里您可能想到了,BackgroundWorker就是遵从这种模式的组件。那么我们在设计组件的时候如 何来选择实现基于事件的APM还是基于IAsyncResult的APM呢,MSDN上有这么一段指导原则: 1) 将基于事件的模式用作默认API 以公开类的异步行为。 2) 当类主要用在客户端应用程序(例如 Windows 窗体)中时,不要公开 IAsyncResult 模式。 ( 比如PictureBox的LoadAsync 方法以及LoadCompleted 事件) 3) 仅在必须公开 IAsyncResult 模式才能满足要求时公开该模式。例如,需要与现有 API 兼容时可 能需要公开 IAsyncResult 模式。 4) 不要在不公开基于事件的模式时公开 IAsyncResult 模式。 如果必须公开 IAsyncResult 模式, 应将其作为高级选项公开。例如,如果生成一个代理对象,则应默认生成基于事件的模式,其中具有一个 生成 IAsyncResult 模式的选项。 5) 在 IAsyncResult 模式实现上生成基于事件的模式实现。 6) 避免在同一个类上同时公开基于事件的模式和 IAsyncResult 模式。在“较高级别”的类上公开 基于事件的模式,在“较低级别”的类上公开 IAsyncResult 模式。例如,比较 WebClient 组件上的基 于事件的模式与 HttpRequest 类上的 IAsyncResult 模式。 来看一个WebClient的例子:
|
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |