微软早在.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
}