使用IAsyncResult設計模式的異步操作是通過名為Begin操作名稱和操作名稱End的兩個方法來實現的,這兩個方法分別開始和結束異步操作。在調用Begin操作名稱後,應用程序可以繼續在調用線程上執行指令,同時異步操作在另一個線程上執行。每次調用Begin操作名稱時,應用程序還應調用End操作名稱來獲取操作的結果。
Begin 操作名稱方法立即將控制權返回給調用線程。如果Begin操作名稱方法引發異常,則會在開始異步操作之前引發異常。如果Begin操作名稱方法引發異常,則意味著沒有調用回調方法。
End操作名稱方法可結束異步操作。End操作名稱方法的返回值與其同步副本的返回值類型相同,並且是特定於異步操作的。從應用程序的主線程調用End操作名稱方法,阻止應用程序執行,直到操作完成之後再繼續執行。
IAsyncResult ar=異步對象。BeginXXX(,); 異步對象。EndXXX(ar); otherthing
由此可見End操作名稱方法的正確實現應該使用返回的IAsyncResult對象的WaitHandle,或者使用IsCompleted輪詢來等待異步執行完成並處理。為了驗證,我使用Reflector查看了FileStream的EndRead方法。
(asyncResult == ArgumentNullException( (! FileStreamAsyncResult result = asyncResult ((result == ) || ( == Interlocked.CompareExchange( result._EndXxxCalled, , NativeOverlapped* nativeOverlappedPtr = (nativeOverlappedPtr != (result._errorCode != __Error.WinIOError(result._errorCode, Path.GetFileName( (result._numBytes + }
在異步編程中使用End操作方法是必需的,即使End操作方法不返回任何值(可能為產生內存洩露,或者其它未知異常)。有一種簡單的使用異步的編程方法必須謹慎,在Begin操作方法中使用AsyncCallback(調用End操作方法),這時雖然不需要再去調用End操作方法,代碼運行也暢通無阻,但是有可能根本來不及執行AsyncCallback程序已經結束。
另外如果在Begin操作方法和End操作方法之間如果無otherthing可做,或者剩下的工作必須等待End操作方法完成之後才可以繼續,此時不建議使用異步(沒啥意義)。