您的位置:首页 > 编程语言

使用 IAsyncResult 进行 .NET 异步编程

2011-03-28 17:09 288 查看
微软早在.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()的返回值是一样的。

例如



publicdelegatestringAsyncMethodCaller((objectparam1,objectparam2); publicclassAsyncDemo { privateAsyncMethodCaller_asyncDelegate=newAsyncMethodCaller(Run); publicIAsyncResultBeginRun(objectparam1,objectparam2,AsyncCallbackasyncCallBack,ObjectasyncState) { asyncDelegate.BeginInvoke(param1,param2,callBack,stateObject); } publicobjectEndRun(IAsyncResultasyncResult) { m_asyncDelegate.EndInvoke(asyncResult); } PublicobjectRun(objectparam1,objectparam2); }

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

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

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

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



IAsyncResultresult=AsyncDemo.BeginRun(param1,param2,null,null);

AsyncDemo.EndRun(result);

//whenRun()methodiscompleted.Continuetogo.

ContinueToGo();




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

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



IAsyncResultresult=AsyncDemo.BeginRun(param1,param2,null,null);

//Waituntiltheoperationcompletes.

result.AsyncWaitHandle.WaitOne();


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

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



IAsyncResultresult=AsyncDemo.BeginRun(param1,param2,null,null);

While(result.IsCompleted!=true)

{

//WaitinguntilIsCompletedistrue.
}

//whenRun()methodiscompleted.Continuetogo.

ContinueToGo();

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

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



PublicvoidMainFunc()

{

AsyncCallbackcallBack=newAsyncCallback(ProcessRun);

IAsyncResultresult=AsyncDemo.BeginRun(param1,param2,callBack,null);

ContinueToGo();

}

PublicvoidProcessRun(IAsyncResultresult)
{

AsyncDemo.EndRun(result);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: