」.Net 中提供了一些線程間更自由通信的工具,他們提供了經過"信號"進行通信的機制ide
能夠經過ManualResetEvent,AutoResetEvent(他是在開門而且一個 WaitOne 經過後自動關門)來進行線程間的通信函數
static void Main(string[] args) { ManualResetEvent mre = new ManualResetEvent(false);//構造函數 false 表示「初始狀態爲關門」,設置爲 true 則初始化爲開門狀態 Thread thread = new Thread(() => { Console.WriteLine("開始等着開門"); mre.WaitOne(); //這裏程序就等着開門 Console.WriteLine("終於開門了"); }); thread.Start(); Console.WriteLine("按任意鍵開門"); Console.ReadKey(); mre.Set();//開門 Console.ReadKey(); }
mre.WaitOne(5000) //還能夠設置等待超時時間:返回true或false工具
WaitHandle.WaitAll(WaitHandle[] waitHandles) //用來等待全部信號都變爲「開門狀態」優化
WaitHandle.WaitAny(WaitHandle[] waitHandles) //用來等待任意一個信號都變爲「開門狀態」spa
每次建立線程、銷燬線程都比較消耗 cpu 資源,所以能夠經過線程池進行優化。線程池是一組已經建立好的線程,隨用隨取,用完了不是銷燬線程,而後放到線程池中,供其餘人用線程
ThreadPool 類的一個重要方法:code
static bool QueueUserWorkItem(WaitCallback callBack, object state) //第二個重載是用來傳遞一個參數給線程代碼的blog
1 static void Main(string[] args) 2 { 3 for (int i = 0; i < 20; i++) 4 { 5 ThreadPool.QueueUserWorkItem(obj => { 6 Console.WriteLine("i="+obj); 7 8 },i); 9 } 10 for (int i = 0; i < 20; i++) 11 { 12 Console.WriteLine("hello"); 13 } 14 Console.ReadKey(); 15 }