在.NET多线程程序中使用异步调用的简易方法

【独家特稿】简介

网站建设、成都网站设计介绍好的网站是理念、设计和技术的结合。创新互联拥有的网站设计理念、多方位的设计风格、经验丰富的设计团队。提供PC端+手机端网站建设,用营销思维进行网站设计、采用先进技术开源代码、注重用户体验与SEO基础,将技术与创意整合到网站之中,以契合客户的方式做到创意性的视觉化效果。

对于开发者来说,运行异步任务简直就是一场恶梦,特别是初学者更是如此。在本文附带的代码中,您将发现一个简单的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编程过程中的线程冲突

标题名称:在.NET多线程程序中使用异步调用的简易方法
分享路径:http://www.shufengxianlan.com/qtweb/news17/553517.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联