使用 IAsyncResult 进行 .NET 异步编程

简介:

微软早在.net2.0, 也就是VS2005的时候,就提供了一整套的异步编程设计模式,有3中常用的方式:

1. 使用 IAsyncResult 调用异步方法

2. 使用委托进行异步编程

3. 使用事件进行异步多线程编程

注: IAsyncResult 方式通常是用委托来实现的。所以可以认为前面2种方式就是一种。

http://msdn.microsoft.com/zh-cn/library/2e08f6yc.aspx

使用 IAsyncResult 调用异步方法

1. 有两个配对的方法,BeginXXX() 和 EndXXX()。它们是XXX()方法的异步执行。

BegingXXX()的参数是在XXX()的参数基础上增加 AsyncCallback 和 AsyncState。

EndXXX()的返回值和XXX()的返回值是一样的。

例如

 

 

 
  1. public delegate string AsyncMethodCaller((object param1, object param2); 
  2.    
  3. public class AsyncDemo 
  4.   
  5.  private AsyncMethodCaller _asyncDelegate = new AsyncMethodCaller(Run); 
  6.   
  7.  public IAsyncResult BeginRun(object param1, object param2, AsyncCallback asyncCallBack, Object asyncState) 
  8.   
  9.  { 
  10.   
  11.  asyncDelegate.BeginInvoke(param1, param2, callBack, stateObject);  
  12.  } 
  13.   
  14.  public object EndRun(IAsyncResult asyncResult) 
  15.   
  16.   
  17. m_asyncDelegate.EndInvoke(asyncResult);  
  18.  } 
  19.   
  20.  Public object Run(object param1, object param2);  

2. IAsyncResult 对象中存储有关异步操作的信息。

3. 阻止应用程序执行的几种方法

a. 通过结束异步操作来阻止应用程序执行

就是EndXXX() 调用时,如果 IAsyncResult 对象表示异步操作未完成,则调用线程会被阻止,就是说它之后的逻辑的会被阻止。

 

 

 
  1. IAsyncResult result = AsyncDemo.BeginRun(param1, param2, nullnull); 
  2.  
  3. AsyncDemo.EndRun(result); 
  4.  
  5. // when Run() method is completed. Continue to go. 
  6.  
  7. ontinueToGo(); 

 

 

b. 使用 AsyncWaitHandle 阻止应用程序的执行。

在BeingXXX()之后调用 IAsyncResult.AsyncWAitHandle 中的相应方法也可以阻止调用线程。例如

 

 

 
  1. IAsyncResult result = AsyncDemo.BeginRun(param1, param2, nullnull); 
  2.  
  3. // Wait until the operation completes. 
  4.  
  5. result.AsyncWaitHandle.WaitOne(); 

 

c. 轮询异步操作的状态。

在BeingXXX()之后调轮询IAsyncResult.IsCompleted属性来确定此操作是否已完成

 

 

 
  1. IAsyncResult result = AsyncDemo.BeginRun(param1, param2, nullnull); 
  2.   
  3.  While(result.IsCompleted != true
  4.   
  5.  { 
  6.   
  7.  // Waiting until IsCompleted is true.  
  8.  } 
  9.   
  10.  // when Run() method is completed. Continue to go. 
  11.   
  12.  ContinueToGo(); 

d. 使用 AsyncCallback 委托结束异步操作。

就是在代理里面根据具体情况调用Endxxx()方法来让调用线程继续运行。

 

 

 
  1. Public void MainFunc() 
  2.   
  3.  { 
  4.   
  5.  AsyncCallback callBack = new AsyncCallback(ProcessRun); 
  6.   
  7.  IAsyncResult result = AsyncDemo.BeginRun(param1, param2, callBack, null); 
  8.   
  9.  ContinueToGo(); 
  10.   
  11.  } 
  12.   
  13.  Public void ProcessRun(IAsyncResult result)  
  14.  { 
  15.   
  16.  AsyncDemo.EndRun(result); 
  17.   
  18.  } 

 本文转自 powertoolsteam 51CTO博客,原文链接:http://blog.51cto.com/powertoolsteam/528841,如需转载请自行联系原作者

相关文章
|
编译器 vr&ar C#
.Net异步编程详解入门
.Net异步编程详解入门目录 前言异步编程不同模式一、异步模式二、基于事件的异步模式三、基于任务的异步模式异步编程的基础一、创建任务二、调用异步方法三、使用Awaiter四、延续任务五、多个异步方法的使用六、使用ValueTasks七、转换异步模式异步编程的错误处理一、异步方法的异步处理二、多个异步方法的异步处理三、使用AggregateException总结 回到顶部前言  今天周五,早上起床晚了。
694 0
|
vr&ar
一起谈.NET技术,.NET中的异步编程:使用F#简化异步编程
  不管是使用yield或借助第三方类库来简化异步编程,或多或少总是感觉不那么正统,有点hack的感觉。这种感觉在实验阶段倒还可以,要是用在产品中总有点担心,即使这些类库来自权威的第三方,我不知道大家有没有跟我同样的感觉。
890 0
|
.NET API 分布式数据库
一起谈.NET技术,.NET异步编程:IO完成端口与BeginRead
  写这个系列原本的想法是讨论一下.NET中异步编程风格的变化,特别是F#中的异步工作流以及未来的.NET 5.0中的基于任务的异步编程模型。但经过前几篇文章(为什么需要异步,传统的异步编程,使用CPS及yield实现异步)的发表后,很多人对IO异步背后实现的原理以及为什么这样能提高性能很感兴趣。
1145 0
|
.NET 分布式数据库 API
一起谈.NET技术,.NET中的异步编程- IO完成端口以及FileStream.BeginRead
  写这个系列原本的想法是讨论一下.NET中异步编程风格的变化,特别是F#中的异步工作流以及未来的.NET 5.0中的基于任务的异步编程模型。但经过三篇文章后很多人对IO异步背后实现的原理以及为什么这样能提高性能很感兴趣。
817 0
|
Web App开发 API C#
.Net 4.5 异步编程初试(async和await)
前言   最近自己在研究Asp.Net Web API。在看到通过客户端来调用Web API的时候,看到了其中的异步编程,由于自己之前没有接触过,所以就稍微的学习了解一下。这两篇文章是: Calling a Web API From a .
1171 0
|
并行计算 Java vr&ar
浅谈.NET下的多线程和并行计算(十).NET异步编程模型基础上
谈多线程谈到现在,我们要明确多线程的一个好处是可以进行并行的运算(充分利用多核处理器,对于桌面应用程序来说就更重要一点了,没有WEB服务器,利用多核只能靠自己),还有一个好处就是异步操作,就是我们可以让某个长时间的操作独立运行,不妨碍主线程继续进行一些计算,然后异步的去返回结果(也可以不返回)。
736 0
|
并行计算 API Windows
浅谈.NET下的多线程和并行计算(十一).NET异步编程模型基础下
上次我们说了,要进行多线程编程,我们可以使用最原始的方式也是最灵活的方式进行,那就是Thread(ThreadPool)+信号量+锁+Control.Invoke。.NET的异步编程模型给我们提供了一种基于IAsyncResult的编程模式,它尤其适用于处理下面的应用场景: 1) 被阻止,正在等待...
833 0
|
3月前
|
开发框架 前端开发 .NET
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
42 0