有一些操作可以在.NET中发生异步的几种方法。既然你没有张贴任何细节,我给比较常见的模式概述:
AsyncWaitHandle
通常你会发现(特别是在.NET框架类)的方法对命名与Begin
和End
(即类似BeginReceive
和EndReceive
)。
调用开始函数返回一个AsyncWaitHandle
对象,它可用于像同步线程常规WaitHandle
(通过调用WaitOne
或者将它传递到静态WaitHandle.WaitAny
或WaitHandle.WaitAll
函数),然后被传递到相应的“结束”功能获取函数的返回值(或者,如果发生了,则抛出遇到的异常)。
如果您使用简单的.NET工具异步调用方法(为函数创建委托并调用BeginInvoke
和EndInvoke
),那么这是您需要使用的方法。但是,大多数内置支持异步操作的API将为您处理实际的异步调用部分,而使用正确命名的BeginXXX
和EndXXX
函数,而不是强制自己创建委托。使用
样品的WaitHandle
:
IAsyncResult result = object.BeginOperation(args);
result.AsyncWaitHandle.WaitOne();
// that will cause the current thread to block until
// the operation completes. Obviously this isn't
// exactly how you'd ordinarily use an async method
// (since you're essentially forcing it to be
// synchronous this way)
returnValue = object.EndOperation(result);
通常异步方法加上事件,如下图所示。
活动
有时,完成它的异步完成后,将引发事件的方法调用。这有时也会与AsyncWaitHandle
方法结合使用,以传递过程已完成的通知。例如,MSMQ库在队列对象上具有BeginReceive
和EndReceieve
函数,以及ReceieveCompleted
事件。当事件触发时,表示可以调用EndReceive
,将从呼叫返回的AsyncWaitHandle
对象传递给BeginReceive
。获取收到的实际消息。
无论采用哪种方式,您都会附加到该事件并像其他任何事件一样使用它。
样品使用AsyncWaitHandle
和事件:
(代码中的某处)
object.OperationComplete += object_OperationComplete;
(其他地方)
IAsyncResult result = object.BeginOperation(args);
// at this point, you can either wait for the event
// to fire, or use the WaitHandle approach as shown
// in the previous example
...
void objectOperationComplete(object sender, AsyncOperationEventArgs e)
{
returnValue = object.EndOperation(e.AsyncResult);
}
这些一般工作在各种不同的方式...您可以保留自己从Begin操作返回的IAsyncResult
,但大多数库会通过临时t IAsyncResult
对象作为其特定EventArgs
类中的属性。
找到作为EventArgs
类的属性的返回值也很常见。如果Begin操作返回IAsyncResult
,则使用该值时正确无误,,即使您需要的数据位于EventArgs
中,调用相应的End函数总是一个好主意。 End函数通常也是捕获异常的方式。
回调
的回调(在.NET)是被提供给异步函数的委托。回调函数不仅用于异步函数,在这种情况下,它们通常是您在调用完成时调用的函数时提供的委托。
回调与事件类似(因为它们都是基于委托的),尽管方法调用和提供的回调之间存在更多的一对一关联。
实施例使用回调:
object.BeginOperation(args, OperationComplete);
...
void OperationComplete(SomeObject results)
{
...
}
有.NET中不同的模式做异步调用。你能提供一些示例代码吗? – 2010-04-13 15:27:38
发表一些代码。通常,异步API调用将委托作为参数 - 只要您调用的任何对象完成,就会调用该委托。委托方法是您的程序中您可以获得“回复”的地方。 – MusiGenesis 2010-04-13 15:29:04
如果API提供了异步方法,那么它必须提供方法/事件来获取这些异步方法的结果,或者自己封装这些方法。 – Bobby 2010-04-13 15:29:24