读书笔记 - .net2.0 异步编程模型: 使用 IAsyncResult 调用异步方法

微软早在.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  {
 6 
 7  private  AsyncMethodCaller _asyncDelegate  =   new  AsyncMethodCaller(Run);
 8 
 9  public  IAsyncResult BeginRun( object  param1,  object  param2, AsyncCallback asyncCallBack, Object asyncState)
10 
11  {
12 
13  asyncDelegate.BeginInvoke(param1, param2, callBack, stateObject); 
14  }
15 
16  public   object  EndRun(IAsyncResult asyncResult)
17 
18  {
19 
20  m_asyncDelegate.EndInvoke(asyncResult); 
21  }
22 
23  Public  object  Run( object  param1,  object  param2); 
24  }

 

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

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

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

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

 

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

    

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

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

 

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

 

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

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

 

 1  IAsyncResult result  =  AsyncDemo.BeginRun(param1, param2,  null null );
 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  }

 

 

你可能感兴趣的:(result)