[C# .Net] ThreadPool 執行緒池

更新於 發佈於 閱讀時間約 5 分鐘

以下內容部分由 ChatGTP 生成。

以下內容部分來自 Microsoft 官網。


執行緒池是 .NET 重要的非同步觀念,因為這是 asyncawait 底層機制之一。

執行緒池是一種系統管理的執行緒集合,用於有效管理和重用執行緒,以降低頻繁創建和銷毀執行緒的開銷。

  • 高效資源管理:執行緒池中的執行緒可重複使用,避免了創建和銷毀執行緒的高昂開銷。
  • 自動調整執行緒數量:執行緒池會根據系統負載動態調整執行緒數量。例如,在任務數量增加時,執行緒池會增加執行緒;在負載減少時,它會釋放部分執行緒。


.NET 有提供 ThreadPool 使用:

for (int i = 0; i < 100; i++)
{
int j = i;

// 進入非同步任務佇列中;實際上就等同於 Task.Run
ThreadPool.QueueUserWorkItem(async (state) =>
{
//await Task.Delay(5000);
await Task.Delay(Random.Shared.Next(1000, 10000));
System.Console.WriteLine($"第 {j,2} 項結束");
});
}

await Task.Delay(4000);

ThreadPool.GetAvailableThreads(
out var workerThreads,
out var completionPortThreads);

System.Console.WriteLine($"可用工作執行緒數量: {workerThreads}");
System.Console.WriteLine(completionPortThreads);
await Task.Delay(-1);



Task 非同步


當呼叫 Task.Run 時,它會將委派的工作項添加到執行緒池的隊列中,並立即返回一個 Task 物件。

執行緒池會在空閒的執行緒中執行此工作,若沒有空閒執行緒,則等待其他任務完成後再執行。

這跟直接創建 Thread 不同,而是將任務丟給 ThreadPool 代為為執行;ThreadPool 據自身狀況提供執行緒來處理任務,因此不會不停的創建 Thread


for (int i = 0; i < 1000; i++)
{
// 由 ThreadPool 代為執行

Task.Run(async ()=>{

Thread.Sleep(5000);

System.Console.WriteLine("任務完成");

});
}

Thread.Sleep(-1); // 阻止程式結束

上面這段程式碼不會同時完成這 1000 個任務,而是 ThreadPool 有空閒的執行緒時,才會分配任務執行,所以實際執行會超過 5 秒很多。

可以看見此程式的執行緒最高維持在一定的數量:

raw-image



Thread 執行緒


ThreadPool 管理著一定數量的 Thread,以達到不頻繁建立 Thread 的目的;

但問題是,精確計時任務將變得不可靠,由此必須自己建立一個新執行緒:

for (int i = 0; i < 1000; i++)
{
// 創建新執行緒直接執行
new Thread(()=>{
Thread.Sleep(5000);
Console.WriteLine("任務完成");
}).Start();
}

Thread.Sleep(-1); // 阻止程式結束

以上程式碼會讓這 1000 任務幾乎同時完成,因為這是在系統中創建 1000 個執行緒直接執行。


且可以看到程式的執行緒數量已經到達 1000 個:

raw-image



留言
avatar-img
留言分享你的想法!
avatar-img
雛鳥之家的沙龍
0會員
1內容數
你可能也想看
Thumbnail
「欸!這是在哪裡買的?求連結 🥺」 誰叫你太有品味,一發就讓大家跟著剁手手? 讓你回購再回購的生活好物,是時候該介紹出場了吧! 「開箱你的美好生活」現正召喚各路好物的開箱使者 🤩
Thumbnail
「欸!這是在哪裡買的?求連結 🥺」 誰叫你太有品味,一發就讓大家跟著剁手手? 讓你回購再回購的生活好物,是時候該介紹出場了吧! 「開箱你的美好生活」現正召喚各路好物的開箱使者 🤩
Thumbnail
我的「媽」呀! 母親節即將到來,vocus 邀請你寫下屬於你的「媽」故事——不管是紀錄爆笑的日常,或是一直想對她表達的感謝,又或者,是你這輩子最想聽她說出的一句話。 也歡迎你曬出合照,分享照片背後的點點滴滴 ♥️ 透過創作,將這份情感表達出來吧!🥹
Thumbnail
我的「媽」呀! 母親節即將到來,vocus 邀請你寫下屬於你的「媽」故事——不管是紀錄爆笑的日常,或是一直想對她表達的感謝,又或者,是你這輩子最想聽她說出的一句話。 也歡迎你曬出合照,分享照片背後的點點滴滴 ♥️ 透過創作,將這份情感表達出來吧!🥹
Thumbnail
撰寫Python的朋友都知道multithread/multiprocess能為我們帶來效能的改進,減少硬體資源的閒置,但在撰寫的過程中常常會發現到我們所設計的工作池模式會需要將「待辦清單」的工作項目當成參數傳遞進去執行, 除了「待辦清單」之外, 其餘的參數基本上都是固定的, 基於這樣的需求之下
Thumbnail
撰寫Python的朋友都知道multithread/multiprocess能為我們帶來效能的改進,減少硬體資源的閒置,但在撰寫的過程中常常會發現到我們所設計的工作池模式會需要將「待辦清單」的工作項目當成參數傳遞進去執行, 除了「待辦清單」之外, 其餘的參數基本上都是固定的, 基於這樣的需求之下
Thumbnail
第三方套件用了Promise或是Reactive,導致所有business logic都要做調整,這就違反「只能有對內的相依方向」的原則。business logic大多數情況下與效能優化無關,通常需要優化的是I/O的存取,這些既然都在外層,就應該在外層做優化,外層的優化不該影響核心,這才是好架構。
Thumbnail
第三方套件用了Promise或是Reactive,導致所有business logic都要做調整,這就違反「只能有對內的相依方向」的原則。business logic大多數情況下與效能優化無關,通常需要優化的是I/O的存取,這些既然都在外層,就應該在外層做優化,外層的優化不該影響核心,這才是好架構。
Thumbnail
  當我們要使用執行緒的時候,就要引用System.Threading的類別庫,程式才可以使用唷!這篇內容先說明:建立與啟用執行緒、跨執行緒控制UI介面、等待或暫停時間執行緒、共享資源的部分。
Thumbnail
  當我們要使用執行緒的時候,就要引用System.Threading的類別庫,程式才可以使用唷!這篇內容先說明:建立與啟用執行緒、跨執行緒控制UI介面、等待或暫停時間執行緒、共享資源的部分。
Thumbnail
  在說執行緒(Thread)時就要先知道什麼是程式(Program)、程序(Process),才能了解什麼是執行緒(Thread),因為它們間都有著神秘的關係與關聯,再更深入一點就又會有多程序(muti-Process)、多執行緒(muti-Thread),我們就先一一說明好了,了解它們後再使用時
Thumbnail
  在說執行緒(Thread)時就要先知道什麼是程式(Program)、程序(Process),才能了解什麼是執行緒(Thread),因為它們間都有著神秘的關係與關聯,再更深入一點就又會有多程序(muti-Process)、多執行緒(muti-Thread),我們就先一一說明好了,了解它們後再使用時
Thumbnail
介紹 委派的非同步方法 可以透過BeginInvoke執行委派的非同步方法 Action<T>.BeginInvoke(<T> obj,AsyncCallback callback,Object @object) 第一個內容的 obj,只的是要傳入acction委派的參數 第二個AsyncCallb
Thumbnail
介紹 委派的非同步方法 可以透過BeginInvoke執行委派的非同步方法 Action<T>.BeginInvoke(<T> obj,AsyncCallback callback,Object @object) 第一個內容的 obj,只的是要傳入acction委派的參數 第二個AsyncCallb
Thumbnail
介紹 📷 定義 處理序(Process) (大陸:進程): 一個程序運行時,占用全部計算資源的總和 執行緒(Thread) (大陸:線程):是作業系統能夠進行運算排程的最小單位。 大部分情況下,它被包含在行程之中,是行程中的實際運作單位。 C#多線程和異步(一)——基本概念和使用方法 執行緒帶來的
Thumbnail
介紹 📷 定義 處理序(Process) (大陸:進程): 一個程序運行時,占用全部計算資源的總和 執行緒(Thread) (大陸:線程):是作業系統能夠進行運算排程的最小單位。 大部分情況下,它被包含在行程之中,是行程中的實際運作單位。 C#多線程和異步(一)——基本概念和使用方法 執行緒帶來的
Thumbnail
介紹 計算機架構相關名詞 📷 中央處理器 (CPU)Central Processing Unit Processors (處理器) Sockets (實體插槽) Cores (實體核心) Logical processors (邏輯核心) 超執行緒(HT)Hyper-Threading Tec
Thumbnail
介紹 計算機架構相關名詞 📷 中央處理器 (CPU)Central Processing Unit Processors (處理器) Sockets (實體插槽) Cores (實體核心) Logical processors (邏輯核心) 超執行緒(HT)Hyper-Threading Tec
Thumbnail
前言 這是第一次寫技術文章,但其實應該也只能說是蒐集很多資料並學習如何透過自己的話解釋的內容,並不能像其他大神可能分享一些很酷的技術,目標就單純是為了完成最後一週的作業(如下)。 走入非同步之前 執行環境(Execution Context) 執行環境堆疊 (Execution stack)
Thumbnail
前言 這是第一次寫技術文章,但其實應該也只能說是蒐集很多資料並學習如何透過自己的話解釋的內容,並不能像其他大神可能分享一些很酷的技術,目標就單純是為了完成最後一週的作業(如下)。 走入非同步之前 執行環境(Execution Context) 執行環境堆疊 (Execution stack)
Thumbnail
行程(進程、process)、執行緒(線程、thread)、上下文切換(context switch)、行程控制塊(PCB)、行程排班(process scheduler)、行程狀態、執行緒模式
Thumbnail
行程(進程、process)、執行緒(線程、thread)、上下文切換(context switch)、行程控制塊(PCB)、行程排班(process scheduler)、行程狀態、執行緒模式
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News