有一些操作可以在.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