單靠自己看書學總是會走很多彎路,任何人也不列外,有些時候自己遇到的很多問題,其它別人在很久之前也可能遇到過,上網查查可以走很大捷徑,對自己的學習有很大幫助,剛開始弄線程這塊,一開始只是看書,很多東西都是糊里又糊塗。
首先感謝下這位仁兄的解讀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