使用 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);
}
1.使用IAsyncResult调用异步方法
2.使用委托进行异步编程
3.使用事件进行异步多线程编程
注:IAsyncResult方式通常是用委托来实现的。所以可以认为前面2种方式就是一种。
使用IAsyncResult调用异步方法
1.有两个配对的方法,BeginXXX()和EndXXX()。它们是XXX()方法的异步执行。
BegingXXX()的参数是在XXX()的参数基础上增加AsyncCallback和AsyncState。
EndXXX()的返回值和XXX()的返回值是一样的。
例如
2.IAsyncResult对象中存储有关异步操作的信息。
3.阻止应用程序执行的几种方法
a.通过结束异步操作来阻止应用程序执行
就是EndXXX()调用时,如果IAsyncResult对象表示异步操作未完成,则调用线程会被阻止,就是说它之后的逻辑的会被阻止。
AsyncDemo.EndRun(result);
//whenRun()methodiscompleted.Continuetogo.
ContinueToGo();
b.使用AsyncWaitHandle阻止应用程序的执行。
在BeingXXX()之后调用IAsyncResult.AsyncWAitHandle中的相应方法也可以阻止调用线程。例如
//Waituntiltheoperationcompletes.
result.AsyncWaitHandle.WaitOne();
c.轮询异步操作的状态。
在BeingXXX()之后调轮询IAsyncResult.IsCompleted属性来确定此操作是否已完成
While(result.IsCompleted!=true)
{
//WaitinguntilIsCompletedistrue.
}
//whenRun()methodiscompleted.Continuetogo.
ContinueToGo();
d.使用AsyncCallback委托结束异步操作。
就是在代理里面根据具体情况调用Endxxx()方法来让调用线程继续运行。
{
AsyncCallbackcallBack=newAsyncCallback(ProcessRun);
IAsyncResultresult=AsyncDemo.BeginRun(param1,param2,callBack,null);
ContinueToGo();
}
PublicvoidProcessRun(IAsyncResultresult)
{
AsyncDemo.EndRun(result);
}
相关文章推荐
- 使用 IAsyncResult 进行 .NET 异步编程
- 使用 IAsyncResult 进行 .NET 异步编程(转载)
- 使用 IAsyncResult 进行 .NET 异步编程
- Mcad学习笔记之异步编程(AsyncCallback委托,IAsyncResult接口,BeginInvoke方法,EndInvoke方法的使用小总结)(转载)
- 异步编程(AsyncCallback委托,IAsyncResult接口,BeginInvoke方法,EndInvoke方法的使用小总结)
- 介绍.net 4.5 异步编程核心内容,如何使用Async和Await进行异步编程
- .net 4.5如何使用Async和Await进行异步编程
- C# winform中使用IAsyncResult实现异步编程
- Mcad学习笔记之异步编程(AsyncCallback委托,IAsyncResult接口,BeginInvoke方法,EndInvoke方法的使用小总结)
- 异步编程(AsyncCallback委托,IAsyncResult接口,BeginInvoke方法,EndInvoke方法的使用小总结)
- 异步编程(AsyncCallback委托,IAsyncResult接口,BeginInvoke方法,EndInvoke方法的使用小总结)
- 异步编程(AsyncCallback委托,IAsyncResult接口,BeginInvoke方法,EndInvoke方法的使用小总结)
- 异步编程(AsyncCallback委托,IAsyncResult接口,BeginInvoke方法,EndInvoke方法的使用小结)
- 使用.NET 2.0中的秒表-Stopwatch类进行速度测试
- .net使用Easyui+MVC进行图片上传的实现
- 准备要使用.net 进行开发
- .NET 多个程序使用一个安装包进行部署
- 使用 ETW 对 .NET 应用程序进行性能诊断
- [转]使用NUnit在.Net编程中进行单元测试
- 使用委托进行异步编程