3 Task中的一些列舉 建立時候的、continue時候的
阿新 • • 發佈:2018-12-30
建立時常用的列舉:
None、PreferFairness、LongRunning、AttacthedToParent、DenyChildAttach、HideScheduler
AttacthedToParent:
背景程式碼如下
using System; using System.Threading; using System.Threading.Tasks; namespace 多執行緒_List { class Program { static void Main(string[] args) {//建立了一個執行緒1 Task t = Task.Factory.StartNew(() => { Console.WriteLine("thread 1"); Task t1 = new Task(() =>{ Thread.Sleep(100); Console.WriteLine( "task 11"); }); Task t2= new Task(() => { Console.WriteLine("task 12"); }); t1.Start(); t2.Start(); //下面continue中的新的執行緒 肯定是在 執行緒1之後 //但是線上程1裡面又另外啟用了2 個執行緒 continue中的執行緒就未必在這兩個執行緒執行完之後執行 }).ContinueWith(_t=> { Console.WriteLine("thread 2"); }); Console.ReadKey(); } } }
thread 1
thread 2
task 12
task 11
這時 如果要continue中啟用的執行緒在task t內部所有執行緒執行完畢之後再執行可以使用 AttacthedToParent列舉
using System; using System.Threading; using System.Threading.Tasks; namespace 多執行緒_List { class Program { static void Main(string[] args) { //建立了一個執行緒1 Task t = Task.Factory.StartNew(() => { Console.WriteLine("thread 1"); Task t1 = new Task(() => { Thread.Sleep(100); Console.WriteLine("task 11"); }, TaskCreationOptions.AttachedToParent); Task t2 = new Task(() => { Console.WriteLine("task 12"); }, TaskCreationOptions.AttachedToParent); t1.Start(); t2.Start(); //下面continue中的新的執行緒 肯定是在 執行緒1之後 //但是線上程1裡面又另外啟用了2 個執行緒 continue中的執行緒就未必在這兩個執行緒執行完之後執行 }).ContinueWith(_t => { Console.WriteLine("thread 2"); }); //如果不允許t1 和 t2附加到t上面 //}, TaskCreationOptions.DenyChildAttach).ContinueWith(_t => //{ // Console.WriteLine("thread 2"); //}); Console.ReadKey(); } } }
執行結果:
thread 1
task 12
task 11
thread 2
AttacthedToParent的效果相當於t.WaitAll(t1,t2)
LongRunning :長時間執行的任務 ,如果你明知道是長時間執行的,建議你使用此列舉。因為這個列舉建立的執行緒是一個新建的Thread 而不是執行緒池的執行緒。為什麼要這麼搞呢,因為如果你不這麼搞,使用的是執行緒池的執行緒,執行緒池的執行緒長期少一個的話,執行緒池會再建立一個執行緒,當你這個執行緒執行完畢還給執行緒池的時候,執行緒池的執行緒就比原來的執行緒池多一個,導致執行緒池執行緒過多,導致cpu切換時間變長等問題。
PreferFairness 讓各個執行緒看起來公平點,會將task扔到ThreadPool的全域性佇列中,讓workthread進行爭搶,不這樣搞預設會放進thread的一個本地佇列中。