快速业务通道

浅谈.NET下的多线程和并行计算(十一).NET异步编程模型基础 下

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-05-20

上次我们说了,要进行多线程编程,我们可以使用最原始的方式也是最灵活的方式进行,那就是 Thread(ThreadPool)+信号量+ 锁+Control.Invoke。.NET的异步编程模型给我们提供了一种基于 IAsyncResult的编程模式,它尤其适用于处理下面的应用场景:

1) 被阻止,正在等待一个 IAsyncResult

2) 被阻止,正在等待多个 IAsyncResult 对象

3) 轮询 IAsyncResult 上的完成情形

.NET还提供了基于事件的异步编程模式,它能够提供:

1) 后台执行耗时任务(例如下载和数据库操作),但不会中断应用程序

2) 同时执行多个操作,每个操作完成时都会接到通知

下面是一个符合基于事件的异步编程模式的类:

public class AsyncExample
{
   public int Method1(string param);
   public void Method2(double param);

   public void Method1Async(string param);
   public void Method1Async(string param, object userState);
   public event Method1CompletedEventHandler Method1Completed;

   public void Method2Async(double param);
   public void Method2Async(double param, object userState);
   public event Method2CompletedEventHandler Method2Completed;

   public void CancelAsync(object userState);

   public bool IsBusy { get; }
}

我们看到它的操作一般提供同步和异步两种模式,异步操作提供一个完成事件,还提供了取消异步操 作的方法。对于某些更高级的组件还提供了汇报进度的功能,通过一个进度汇报事件来完成,此事件通常 将叫做 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的例子:

WebClient wc = new WebClient();
wc.Encoding = Encoding.UTF8;
wc.DownloadStringCompleted += new DownloadStringCompletedEventHandler (wc_DownloadStringCompleted);
wc.DownloadProgressChanged += new DownloadProgressChangedEventHandler (wc_DownloadProgressChanged);
wc.DownloadStringAsync(new Uri("http://www.cnblogs.com"), "test&q

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号