Thread(線程)三
阿新 • • 發佈:2017-08-04
toa mage name 事件 turn *** line 其他 edt
今天我們繼續接著線程講講,上一章提到一下task概念,
首先接著task繼續往下講,在前章節提到過Thread怎麽實現其他線程完成後再讓主線程繼續執行的功能,那麽如果Task也需要線程等待事件,該怎麽實現呢?
在這裏介紹四種方法。
1、ContinueWhenAny方法
taskFactory.ContinueWhenAny(taskList.ToArray(), t => { //t.AsyncState Console.WriteLine("這裏是ContinueWhenAny {0}", Thread.CurrentThread.ManagedThreadId); });
這種做法是在等task對象list集合中的任何一個線程完成後執行回調函數。
2、ContinueWhenAll方法
taskFactory.ContinueWhenAll(taskList.ToArray(), tList => { Console.WriteLine("這裏是ContinueWhenAll {0}", Thread.CurrentThread.ManagedThreadId); });
這種是等list集合全部完成後在執行,在執行回調函數
3、WaitAny方法
Task.WaitAny(taskList.ToArray());//執行的線程等待某一個task的完成 Console.WriteLine("after WaitAny{0}", Thread.CurrentThread.ManagedThreadId);
只要等待其中任何一個線程完成,就會繼續後面的程序代碼。
4、WaitAll方法
Task.WaitAll(taskList.ToArray());//執行的線程等待全部的task的完成 Console.WriteLine("after WaitAll{0}", Thread.CurrentThread.ManagedThreadId);
等待多有線程完成後再去執行後面程序代碼。
一般來說有這四種方法,可以解決等待事件的所有需求,如果不能實現,那有可能是程序設計上有些問題了。
***********************************************************************************************************************************************
Parallel:這個是.net後面提出的概念
Parallel.Invoke(() => this.TestThread("btnParallel_Click_0") , () => this.TestThread("btnParallel_Click_1") , () => this.TestThread("btnParallel_Click_2") , () => this.TestThread("btnParallel_Click_3") , () => this.TestThread("btnParallel_Click_4")); //等於使用4個task,然後主線程同步invoke一個委托 然後主線程waitall
這種做法就是讓主線程也參與在計算中,充分利用資源吧。
Parallel.For(6, 10, t => { string name = string.Format("For btnParallel_Click_{0}", t); this.TestThread(name); }); Parallel.ForEach(new int[] { 5, 6, 7, 10, 8473847 }, t => { string name = string.Format("ForEach btnParallel_Click_{0}", t); this.TestThread(name); }); ParallelOptions parallelOptions = new ParallelOptions() { MaxDegreeOfParallelism = 5//相當於設置一個最大的線程數 }; Parallel.For(6, 15, (t, state) => { string name = string.Format("btnParallel_Click_{0}", t); this.TestThread(name); Console.WriteLine(state); state.Break();//退出單次循環 state.Stop();//退出全部的循環 return; });
Thread(線程)三