使用 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.  } 

 

你可能感兴趣的:(多线程,.net,职场,异步编程,休闲)