程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 異步編程模型

異步編程模型

編輯:C#入門知識

      使用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操作方法完成之後才可以繼續,此時不建議使用異步(沒啥意義)。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved