第四節:Task的啟動的四種方式以及Task、TaskFactory的線程等待和線程延續的解決方案


一. 背景

揭秘:

  在前面的章節介紹過,Task出現之前,微軟的多線程處理方式有:Thread→ThreadPool→委托的異步調用,雖然也可以基本業務需要的多線程場景,但它們在多個線程的等待處理方面、資源占用方面、線程延續和阻塞方面、線程的取消方面等都顯得比較笨拙,在面對復雜的業務場景下,顯得有點捉襟見肘了。

  正是在這種背景下,Task應運而生。

  Task是微軟在.Net 4.0時代推出來的,也是微軟極力推薦的一種多線程的處理方式,Task看起來像一個Thread,實際上,它是在ThreadPool的基礎上進行的封裝,Task的控制和擴展性很強,在線程的延續、阻塞、取消、超時等方面遠勝於Thread和ThreadPool。

 

二. Task的4種啟動方式

概要: 

  Task的啟動有4種方式,其中3種異步啟動開啟一個新線程,1種同步啟動的方式(有點和委托類似,BeginInvoke異步啟動,Invoke同步啟動),分別是:實例化的方式+Start方法啟動、Task下Run方法啟動、TaskFactory工廠的StartNew方法啟動、Task下的同步方法RunSynchronously 啟動。

1. 實例化的方式啟動,調用Start方法

   Task的構造函數中的參數是Action委托(注:不是Action<>多個重載),所以直接使用 ()=>{   }的方式傳參,簡潔明了,然后調用Start方式啟動。

2. 調用Task類下的靜態方法Run,進行啟動

   使用該方式啟動,更加簡潔,不需要實例化,也不需要調用Start方法,Run方法直接通過Action委托的方式進行傳參即可(即:  ()=>{} )。

3. TaskFactory工廠啟動

   使用TaskFactory工廠的StartNew方法啟動,其中TaskFactory工廠可以直接實例化,或者 Task.Factory (推薦)。

 

4. 實例化方式RunSynchronously同步啟動

   Task實例化的方式,然后調用同步方法RunSynchronously ,進行線程啟動。(PS: 類似委托開啟線程,BeginInvoke是異步,而Invoke是同步)

 

三. Task的線程等待和延續

揭秘:

  線程等待和延續通常情況放在一起來說,在同步方法中,即在單線程中,業務代碼塊按照從上往下的順序執行,下面的代碼塊必須要等上面的代碼塊執行完畢后才能繼續執行,這本身就是一種等待和延續,只不過是單線程內的等待和延續。

  同理,來到多線程領域,這里的等待就不單單局限於代碼塊之間的等待和延續了,而是上升到某個線程 要等待 另外一個線程執行完畢后方能執行,這里特別說明一下,前面的章節提到線程等待基本上都是主線程在等子線程,當然,完全可能是子線程之間的相互等待和延續(實際上,這種情況更多)。

  Task下的線程等待和延續主要以下幾類:

  ①. Wait:針對單個Task的實例,可以task1.wait進行線程等待.  <Task的實例方法>

  ②. WaitAny:執行的線程等待其中任何一個線程執行完畢即可執行(如果主線程執行,則卡主線程)  <Task的靜態方法>

  ③. WaitAll:執行的線程等待其中所有線程執行完畢方可執行(如果主線程執行,則卡主線程)       <Task的靜態方法>

  ④. WhenAny:與下面ContinueWith配合執行,當傳入的線程中任何一個線程執行完畢,繼續執行ContinueWith中的任務(屬於開啟新線程,不卡主線程)   <Task的靜態方法>

  ⑤. WhenAll:與下面ContinueWith配合執行,當傳入的線程中所有線程執行完畢,繼續執行ContinueWith中的任務(屬於開啟新線程,不卡主線程)     <Task的靜態方法>

  ⑥. ContinueWith:和上面WhenAny和WhenAll配合使用    <Task的實例方法>

1. WaitAny(執行的線程等待其中任何一個線程執行完畢即可執行)

   這里給出線程等待加入集合中的代碼,下面的線程等待通用這一部分代碼,將不再列出。

2. WaitAll(執行的線程等待其中所有線程執行完畢方可執行)

 

3. WhenAny+ContinueWith

    當其中一個線程執行完成后,新開啟了一個線程執行,繼續執行新業務,所以執行過程中,不卡主線程。

4. WhenAll+ContinueWith

   當其中所有線程執行完成后,新開啟了一個線程執行,繼續執行新業務,所以執行過程中,不卡主線程。

四. TaskFactory的線程等待

說明: TaskFactory可以開啟線程,當然也對應的線程的等待和延續。

  ①:ContinueWhenAny:等價於Task的WhenAny+ContinueWith

  ②:ContinueWhenAll:等價於Task的WhenAll+ContinueWith

1. ContinueWhenAny

 

2. ContinueWhenAll

 

 

 

 

 


免責聲明!

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



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