第四节: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
?
?
總結
以上是生活随笔為你收集整理的第四节:Task的启动的四种方式以及Task、TaskFactory的线程等待和线程延续的解决方案的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c#中常用集合类和集合接口之接口系列【转
- 下一篇: 北方高温何时退?南方暴雨何时停?都得等同