2018年8月19日 星期日

【C#】Thread 101


外緒最主要的功能是防止一個耗時過長的任務 block 主緒導致 UI 不能操作且程式看起來像沒有回應。

多緒並不總是比較快,比方多個執行緒存取相同的資源,進行短時間的簡單計算,資源的分配與執行緒的調動成本最終可能比計算更高。

執行緒的使用時機應該是
  1. 以外緒防止 UI hang 住
  2. 同時大量獨立的要求
  3. 需要知道進度
  4. 耗時長的運算
  5. 有優先度或順序性的運算
比方讀取成績、計算加權排名;
在A緒每完成讀取成績時就可以吐給使用者先看、並同時以B緒運算加權分數並加入排名樹。

前/背景緒
由 new Thread() 建出的緒預設為前景緒,除非強制關閉,否則 Process 會等到所有前景緒結束才關閉。
static void Main(string[] args)
{
    Thread t = new Thread(() =>
    {
        for (int i = 0; i < 5; i++)
        {
            Console.WriteLine(i + 1);
            Thread.Sleep(1000);
        }
    });
    // t.IsBackground = true;
    t.Start();
    Console.ReadLine();
}
若按下 Enter 觸發 Console.ReadLine() cmd 也不會馬上關閉,而是等到 t 執行完,若 IsBackground = true 則即使 t 未執行完 cmd 也會馬上關閉。
一般我們會用的是背景緒。

Thread Pool
提供已預先建好並納管的背景緒,降低執行緒的建構/回收成本。
一般會從這裡抽而不是自己建;從這抽出的緒完成任務後會回歸,降低反覆建置的成本。


沒有留言:

張貼留言