[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
留言分享你的想法!

































































你可能也想看
Google News 追蹤
Thumbnail
避免 thread 競速(Race Condition)是多執行緒編程中常見的挑戰之一。 Race Condition 發生在多個執行緒同時訪問和修改共享資源時,因為執行緒之間的執行順序無法預測,可能會導致數據的不一致性或意外行為。 本文主要介紹如何使用Lock來避免此狀況出現。 首先先看沒
Thumbnail
在網路速度有限的情況下,依序記錄不斷產生的資訊,能統計使用者在頁面上操作了哪些功能。
Thumbnail
簡要說明 JavaScript 的 Event Loop JavaScript 是單執行緒 (single-threaded) 語言,這意味著它一次只能執行一件事,因此所有函式都需要排隊等待執行,這被稱為同步 (synchronous)。在同步操作中,若函式過多或過於複雜,會導致程式阻塞 (blo
※ 同步概念: 單純地「由上而下」執行程式碼,而且一次只執行一件事,也就是「按順序執行,一個動作結束才能切換到下一個」。缺點是你需要「等待」事情執行完畢,才能繼續往下走。 ※ 非同步概念: 盡可能讓主要的執行程序不需要停下來等待,若遇到要等待的事情,就發起一個「非同步處理」,讓主程序繼續執行,
Thumbnail
當你需要在 Python 中執行多個任務,但又不希望它們相互阻塞時,可以使用 threading 模組。 threading 模組允許你在單個程序中創建多個執行緒,這些執行緒可以同時運行,從而實現並行執行多個任務的效果。
Thumbnail
非同步程式設計(Asynchronous programming) 或是簡單的稱之為 async,它是一種並發程式模型(concurrent programming model),其目的就是讓多個任務能同時在作業系統的執行緒上執行,並透過 async/.await 保留同步。
Thumbnail
為什麼需要非同步? 我們在「【Web微知識系列】 Web Workers」有介紹到在瀏覽器可執行腳本Javascript環境底下如何完成非同步的操作, 主要是為了讓任務更有效率的進行, 不會因為一個非常耗時的工作堵塞住整個服務, 導致無法服務他人的窘境。 大家應該經常在餐廳裡會看到服務員協
Thumbnail
關於多執行緒/多行程的使用方式 在Python 3.2版本之後加入了「concurrent.futures」啟動平行任務, 它可以更好的讓我們管理多執行緒/多行程的應用場景,讓我們在面對這種併發問題時可以不必害怕, 用一個非常簡單的方式就能夠處裡, 底下我們將為您展示一段程式碼: imp
Thumbnail
介紹 📷 定義 處理序(Process) (大陸:進程): 一個程序運行時,占用全部計算資源的總和 執行緒(Thread) (大陸:線程):是作業系統能夠進行運算排程的最小單位。 大部分情況下,它被包含在行程之中,是行程中的實際運作單位。 C#多線程和異步(一)——基本概念和使用方法 執行緒帶來的
Thumbnail
避免 thread 競速(Race Condition)是多執行緒編程中常見的挑戰之一。 Race Condition 發生在多個執行緒同時訪問和修改共享資源時,因為執行緒之間的執行順序無法預測,可能會導致數據的不一致性或意外行為。 本文主要介紹如何使用Lock來避免此狀況出現。 首先先看沒
Thumbnail
在網路速度有限的情況下,依序記錄不斷產生的資訊,能統計使用者在頁面上操作了哪些功能。
Thumbnail
簡要說明 JavaScript 的 Event Loop JavaScript 是單執行緒 (single-threaded) 語言,這意味著它一次只能執行一件事,因此所有函式都需要排隊等待執行,這被稱為同步 (synchronous)。在同步操作中,若函式過多或過於複雜,會導致程式阻塞 (blo
※ 同步概念: 單純地「由上而下」執行程式碼,而且一次只執行一件事,也就是「按順序執行,一個動作結束才能切換到下一個」。缺點是你需要「等待」事情執行完畢,才能繼續往下走。 ※ 非同步概念: 盡可能讓主要的執行程序不需要停下來等待,若遇到要等待的事情,就發起一個「非同步處理」,讓主程序繼續執行,
Thumbnail
當你需要在 Python 中執行多個任務,但又不希望它們相互阻塞時,可以使用 threading 模組。 threading 模組允許你在單個程序中創建多個執行緒,這些執行緒可以同時運行,從而實現並行執行多個任務的效果。
Thumbnail
非同步程式設計(Asynchronous programming) 或是簡單的稱之為 async,它是一種並發程式模型(concurrent programming model),其目的就是讓多個任務能同時在作業系統的執行緒上執行,並透過 async/.await 保留同步。
Thumbnail
為什麼需要非同步? 我們在「【Web微知識系列】 Web Workers」有介紹到在瀏覽器可執行腳本Javascript環境底下如何完成非同步的操作, 主要是為了讓任務更有效率的進行, 不會因為一個非常耗時的工作堵塞住整個服務, 導致無法服務他人的窘境。 大家應該經常在餐廳裡會看到服務員協
Thumbnail
關於多執行緒/多行程的使用方式 在Python 3.2版本之後加入了「concurrent.futures」啟動平行任務, 它可以更好的讓我們管理多執行緒/多行程的應用場景,讓我們在面對這種併發問題時可以不必害怕, 用一個非常簡單的方式就能夠處裡, 底下我們將為您展示一段程式碼: imp
Thumbnail
介紹 📷 定義 處理序(Process) (大陸:進程): 一個程序運行時,占用全部計算資源的總和 執行緒(Thread) (大陸:線程):是作業系統能夠進行運算排程的最小單位。 大部分情況下,它被包含在行程之中,是行程中的實際運作單位。 C#多線程和異步(一)——基本概念和使用方法 執行緒帶來的