微软早在.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()的返回值是一样的。
例如
public delegate string AsyncMethodCaller((object param1, object param2);
public class AsyncDemo
{
private AsyncMethodCaller _asyncDelegate = new AsyncMethodCaller(Run);
public IAsyncResult BeginRun(object param1, object param2, AsyncCallback asyncCallBack, Object asyncState)
{
asyncDelegate.BeginInvoke(param1, param2, callBack, stateObject);
}
public object EndRun(IAsyncResult asyncResult)
{
m_asyncDelegate.EndInvoke(asyncResult);
}
Public object Run(object param1, object param2);
}
2. IAsyncResult 对象中存储有关异步操作的信息。
3. 阻止应用程序执行的几种方法
a. 通过结束异步操作来阻止应用程序执行
就是EndXXX() 调用时,如果 IAsyncResult 对象表示异步操作未完成,则调用线程会被阻止,就是说它之后的逻辑的会被阻止。
IAsyncResult result = AsyncDemo.BeginRun(param1, param2, null, null);
AsyncDemo.EndRun(result);
// when Run() method is completed. Continue to go.
ContinueToGo();
b. 使用 AsyncWaitHandle 阻止应用程序的执行。
在BeingXXX()之后调用 IAsyncResult.AsyncWAitHandle 中的相应方法也可以阻止调用线程。例如
IAsyncResult result = AsyncDemo.BeginRun(param1, param2, null, null);
// Wait until the operation completes.
result.AsyncWaitHandle.WaitOne();
c. 轮询异步操作的状态。
在BeingXXX()之后调轮询IAsyncResult.IsCompleted属性来确定此操作是否已完成
IAsyncResult result = AsyncDemo.BeginRun(param1, param2, null, null);
While(result.IsCompleted != true)
{
// Waiting until IsCompleted is true.
}
// when Run() method is completed. Continue to go.
ContinueToGo();
d. 使用 AsyncCallback 委托结束异步操作。
就是在代理里面根据具体情况调用Endxxx()方法来让调用线程继续运行。
Public void MainFunc()
{
AsyncCallback callBack = new AsyncCallback(ProcessRun);
IAsyncResult result = AsyncDemo.BeginRun(param1, param2, callBack, null);
ContinueToGo();
}
Public void ProcessRun(IAsyncResult result)
{
AsyncDemo.EndRun(result);
}
分享到:
相关推荐
使用IAsyncResult 对象的异步操作与使用事件的异步操作
使用异步调用之前,要定义一个委托,它的方法签名要与 调用方法签名一致。.NET会自动产生此委托的BeginInvoke和EndInvoke方法。 BeginInvoke 方法用于启动异步调用。它除了具有调用方法相同的参数外,还附加了两个...
异步编程模型(APM)是.NET1.0的时候已经推出的古老异步编程模式,此模式基于IAsyncResult接口实现。 随着技术的发展,又在“.NET1.0异步编程模型(APM)”之后推出了“.NET2.0基于事件的编程模式”及“.NET4.X...
异步编程(AsyncCallback委托,IAsyncResult接口,BeginInvoke方法,EndInvoke方法的使用小总结)
//AsyncCallback 为客户端应用程序提供完成异步操作的方法。开始异步操作时,该回调委托被提供给客户端。AsyncCallback 引用的事件处理程序包含完成...//AsyncCallback 使用 IAsyncResult 接口获取异步操作的状态。
上一篇,我给大家介绍了“.NET1.0中基于IAsyncResult设计模式的异步编程模型(APM)”,它使用System.Threading命名空间的类来构造多线程应用程序。然而要想有效地使用这些工具类,需要有丰富的使用多线程软件工程的...
异步编程概述 讨论基于 IAsyncResult 的异步设计模式,此模式提供灵活的处理异步操作的编程模型。 使用 IAsyncResult 调用异步方法 ...介绍基于事件的异步模式,该模式提供使用事件进行跨线程通信的异步编程模型。
异步方法执行,使用BeginInvoke (AsyncCallback委托对象) ,而不用返回值
.Net使用从线程池中得到的线程来执行通过BeginInvoke()分配的方法,当异步方法执行完成时,工作线程调用回调方法而不只直接回到线程池中,要实现回调方法,我们必须在使用beginInvoke()方法的时候指定一个参数为...
本软件是使用套接字、ReceiveCallBack(IAsyncResult AR)函数为例的客服实例,修正了关闭客户端会导致异常的Bug;并且还是一个RichTextBox颜色使用的范例,不同的事件使用不同的颜色:如用户登录用红色、用户名用绿色...
Google一下,可以知道ASP.NET实现异步处理的话,实现IHttpAsyncHandler接口就可以了。该接口的BeginProcessRequest(HttpContext context, AsyncCallback cb, object extraData)方法返回一个IAsyncResult对象。当不...
EndConnect 在中启动阻止方法,在完成异步远程主机连接请求BeginConnect方法。 然后再调用BeginConnect,你需要创建实现一个回调方法AsyncCallback委托。 该回调方法在一个单独的线程中执行,并由系统后调用...
当前实现的 Begin/End 设计模式 System.Net.Sockets.Socket 类需要 System.IAsyncResult 对于每个异步套接字操作分配对象。 在新 System.Net.Sockets.Socket 类增强功能,异步套接字操作进行了描述可重用通过 ...
可以使用由BeginInvoke方法返回的IAsyncResult的IsCompleted属性来发现异步调用何时完成。从用户界面的服务线程中进行异步调用时可以执行此操作。轮询完成允许调用线程在异步调用在线程池线程上执行时继续执行。 ...
.NET Compact Framework 中不支持异步委托调用,也就是 BeginInvoke 和 EndInvoke 方法。 BeginInvoke 方法启动异步调用。该方法与您需要异步执行的方法具有相同的参数,还有另外两个可选参数。第一个参数是一个 ...
C#异步调用四大方法的使用是如何进行的呢?让我们首先了解下什么时候用到C#异步调用: .NET Framework 允许您C#异步调用任何方法。定义与您需要调用的方法具有相同签名的委托;公共语言运行库将自动为该委托定义...
《CLR via C#(第3版) 》针对.NET Framework 4.0和多核编程进行了全面更新和修订,是帮助读者深入探索和掌握公共语言运行时、C#和.NET开发的重要参考,同时也是帮助开发人员构建任何一种应用程序(如Microsoft ...
* 使用WaitOne方法等待异步方法执行完成 * 在指定时间之内。WaitOne方法将一直等待,直到异步调用完成,并发出通知 * ************************************************************/ /* private delegate...
服务器工具包库ServerToolkit 是一组可用于构建高性能 .NET 服务器的项目。项目积极发展——已完成 85% 未来项目IAsyncResult/消息队列服务器时间戳字典纯 .NET HttpListener 异步套接字包装器
本文主要介绍了C#中 Thread,Task,Async/Await,IAsyncResult的相关知识。具有一定的参考价值,下面跟着小编一起来看下吧