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

原创
开发 后端
本文将向读者详细介绍一种使用异步调用的简单方法,希望对大家开发.NET多线程程序有所帮助。

【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编程过程中的线程冲突
责任编辑:彭凡 来源: 51CTO
相关推荐

2011-08-31 16:30:19

Lua多线程

2009-11-09 10:50:30

WCF异步调用

2024-01-07 17:29:10

编程语言线程Rust

2010-01-11 17:24:19

VB.NET异步调用

2009-08-17 16:49:46

C#多线程控制

2009-11-06 15:54:15

WCF异步调用

2009-10-20 16:48:30

C#委托

2009-12-07 14:26:47

WCF异步调用

2018-06-21 14:46:03

Spring Boot异步调用

2010-02-25 09:13:34

WCF异步调用

2009-12-21 14:10:26

WCF异步调用

2021-03-22 08:45:30

异步编程Java

2009-07-01 14:23:46

JavaScript异

2009-07-01 14:37:14

JavaScript异

2009-07-01 14:31:01

JavaScript异

2021-03-29 09:26:44

SpringBoot异步调用@Async

2009-07-01 13:58:00

JavaScript异

2009-08-21 13:18:25

C#异步调用

2024-03-06 08:40:16

ReactJavascriptUI交互

2010-04-14 09:20:26

.NET多线程
点赞
收藏

51CTO技术栈公众号