線程的控制和線程池

一.WaitHandle:

    」.Net 中提供了一些線程間更自由通信的工具,他們提供了經過"信號"進行通信的機制ide

能夠經過ManualResetEvent,AutoResetEvent(他是在開門而且一個 WaitOne 經過後自動關門)來進行線程間的通信函數

    • waitOne:    等待開門
    • Set:           開門
    • Reset:       關門
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 }
線程池的使用
相關文章
相關標籤/搜索