在.NET多线程程序中使用异步调用的简易方法
创始人
2024-06-08 16:00:52
0

【51CTO独家特稿】简介

对于开发者来说,运行异步任务简直就是一场恶梦,特别是初学者更是如此。在本文附带的代码中,您将发现一个简单的AsyncWorker类,它能够使您轻松完成异步任务的处理,即使您对异步调用没有全面深入的了解。当然,我们也很希望看到您贡献的代码,尤其是对于ReportProgress函数,因为它还未经测试。 

背景知识 

我为什么编写这个助手类(helper class)呢? 简单地说,这是因为我不喜欢.NET BackgroundWorker类,以及所有与IsBusy参数有关的问题。有时候,即使您成功地终止了异步任务,IsBusy也不会从true变为false。类backgroundWorker会强迫您在while循环中使用Application.DoEvents。也许还有其它正确使用它的方法,但是我至今还没找到。我尝试按照backgroundWorker的设计方法建立一个尽可能简单的替换物。  

代码用法  

如果您看过BackgroundWorker的文档,那么使用下面的代码也应该不成问题。为了初始化AsyncWorker,我们做如下定义:

AsyncCallback m_asyncWorker;  

然后,在您的代码(构造函数)中对其进行初始化,如下所示:

  1. //通过设置maximumCount,我们可以对简单的ThreadPool进行摹拟。  
  2. //参数maximumCount用于指出可以同时启动多少个并行的线程。如果abortIfBusyParameter被设为true,那么其他线程就只能等待,或者被拒绝。  
  3. this.m_asyncWorker = new AsyncWorker(1);  
  4.  
  5. //分配一个后台任务  
  6. this.m_asyncWorker.DoWork += new DoWorkEventHandler(m_asyncWorker_DoWork); 

您的后台任务可以是任何您喜欢的东西: 

  1. void m_asyncWorker_DoWork(object sender, DoWorkEventArgs e) {  
  2.            Console.WriteLine("Hello world! I was started asynchronously.");  
  3.         }   

最后调用background worker :

  1. //因为abortIfBusyParameter 被设置为true,所以如果前面的调用仍然在运行的话,RunWorkerAsync将返回false(中止调用)。   
  2. if (!this.m_asyncWorker.RunWorkerAsync(true)) {  
  3.  Console.WriteLine("Worker in use....");  

通过把RunWorkerAsync参数abortIfBusy设置为true,即使前面的异步调用仍在运行,您也可以跳过这个事件。通过将其设为false,它会进入一个等待队列,并在IsBusy从true转换为false的时候马上触发。 这个机制对于性能敏感的应用程序来说非常有用。如果您有许多启动异步调用的“低优先级”事件,并且如果前面的异步调用仍在运行(IsBusy),那么您可以决定是否应该启动另一个异步调用。   

例如:如果您在屏幕上拖动一个对象的时候,那么就无需每次都重绘它。只有当IsBusy为false的时候才需对其进行绘制。 如果您想要获得平滑效果,只需增加maximumCount(您的线程池)即可。

最后,如果您需要一个回调函数,那么您可以自己预订RunWorkerCompleted事件。

  1. //分配RunWorkerCompleted。它是您的回调函数事件。  
  2. this.m_asyncWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(m_asyncWorker_RunWorkerCompleted); 

结束语 

希望这个工具可以使您的生活变得更加轻松。请不要询问JustDoSomething类的锁定问题,因为它是其它测试的一部分。

【编辑推荐】

  1. .NET上执行多线程应该注意的两点
  2. C#多线程控制进度条之多线程安全
  3. 通过多线程为基于.NET的应用程序实现响应迅速
  4. .NET 4.0中任务与线程关系谈
  5. 详解.NET编程过程中的线程冲突

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
着眼MAC地址,解救无法享受D... 在安装了DHCP服务器的局域网环境中,每一台工作站在上网之前,都要先从DHCP服务器那里享受到地址动...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...