c#線程之異步委托begininvoke、invoke、AsyncWaitHandle.WaitOne 、異步回調


  單靠自己看書學總是會走很多彎路,任何人也不列外,有些時候自己遇到的很多問題,其它別人在很久之前也可能遇到過,上網查查可以走很大捷徑,對自己的學習有很大幫助,剛開始弄線程這塊,一開始只是看書,很多東西都是糊里又糊塗。

  首先感謝下這位仁兄的解讀http://www.cnblogs.com/renhaojie/archive/2009/09/10/1564052.html,我在這里只做下自己迷惑的地方的解讀。

 

  1,Delegate.BeginInvoke是開起一個新的異步線程執行委托,而Delegate.EndInvoke則是結束這個委托。

  2,Delegate.BeginInvoke總有兩個參數,參數一IAsyncResult,一個是Object,這兩個參數主要是在異步回調的時候會用得到,這個兩個參數總是在參數的最后兩位,前幾位參數是這個委托對應方法的參數。

  3.Delegate.EndInvoke返回值是委托所對應方法的返回值。如果委托或者方法未執行完畢,則Delegate.EndInvoke會一直處於阻塞狀態;委托或者方法執行完畢,則Delegate.EndInvoke開始執行,並得到返回值。

  4,假設IAsyncResult ar = d1.BeginInvoke(1,3000,null,null);則ar.IsCompleted與ar.AsyncHandle.WaitOne(50,flse)具有相同效果,可用來判斷改異步委托是否執行完畢。WaitOne(50,flse),50為定義要等待的時間,false為在定義時間內未完成委托時返回值(Bool)

  5.對於異步回調有幾個問題需要注意,例如d1.BeginInvoke(1, 3000, TakeAWhileDelegateCompleted, d1);

    ①這個事先執行委托d1(BeginInvoke前的這個d1),后在執行參數的d1,而后在執行TakeAWhileDelegateCompleted方法。

    ②對於參數d1,如果d1是委托或者方法,這執行這個方法,並將返回值作為TakeAWhileDelegateCompleted的參數傳遞給TakeAWhileDelegateCompleted,而這個IAsyncResult一定是個方法(這樣才能執行異步回調),參數的d1也可以是object類型的變量等

    ③TakeAWhileDelegateCompleted是BeginInvoke的IAsyncResult參數,但是TakeAWhileDelegateCompleted這個方法或者委托只有一個參數為IAsyncResult類型,該參數值從BeginInvoke的object參數(d1)獲得,在TakeAWhileDelegateCompleted內部,可以用IAsyncResult.AsyncState獲得參數值。

    ④對於異步回調,如果主線程結束,則不管委托線程是否結束,所有線程都結束,即如果主線程結束,委托線程未結束,則強迫中止委托線程

  6,Invoke方法直接返回方法或者委托的結果,好比執行了Delegate.BeginInvoke和Delegate.EndInvoke


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM