C#線程池詳解

一、線程池的概念

1、線程的創建和銷毀要付出較高的代價,頻繁創建和銷毀線程會降低系統的性能。線程池就是一些在應用程序起始時就創建好的線程,這些線程可用於執行應用程序需要的不同操作。

2、線程池為每個任務提供一個工作線程,任務執行完後工作線程的狀態會重置,以便執行下一個任務,而不是被銷毀。

3、線程池有一個任務隊列,所有等待執行的任務都進入任務隊列,在有空閑線程時會從隊列中取出一個任務執行,如果沒有空閑線程就等待直到有線程可用。

using System;
using System.Threading;

namespace ThreadPoolExample
{
    class Program
    {
        static void Main(string[] args)
        {
            for (int i = 0; i < 10; i++)
            {
                ThreadPool.QueueUserWorkItem(PrintHello);
            }
            Console.ReadKey();
        }

        private static void PrintHello(object state)
        {
            Console.WriteLine($"Hello from thread {Thread.CurrentThread.ManagedThreadId}");
        }
    }
}

二、線程池的使用

1、線程池的創建

線程池是由framework提供的,可以使用ThreadPool類的靜態方法來創建。ThreadPool.GetMaxThreads()方法返回可用於線程池的最大線程數。ThreadPool.GetAvailableThreads()方法返回線程池中空閑線程的數量。

int maxThreads;
int availableThreads;
ThreadPool.GetMaxThreads(out maxThreads, out availableThreads);
Console.WriteLine($"Max threads: {maxThreads}. Available threads: {availableThreads}");

2、線程池的任務添加

可以使用ThreadPool.QueueUserWorkItem()方法添加任務到線程池,該方法接受一個委託作為參數,需要執行的代碼可以是匿名方法或普通方法。

ThreadPool.QueueUserWorkItem(new WaitCallback(PrintHello));
ThreadPool.QueueUserWorkItem(PrintHello);

3、線程池的工作隊列

可以使用ThreadPool.GetQueuedThreadInfo()方法獲取線程池正在排隊的工作線程的一些信息。

ThreadPool.GetQueuedThreadInfo(out int queueLength, out int workerThreads);
Console.WriteLine($"Queue length: {queueLength}. Worker threads: {workerThreads}");

三、線程池的優化

1、線程池的自定義大小

線程池的大小默認是由CLR制定的,但可以通過調用ThreadPool.SetMaxThreads()和ThreadPool.SetMinThreads()方法來自定義。

ThreadPool.SetMaxThreads(4, 4);
ThreadPool.SetMinThreads(2, 2);

2、使用線程池執行長時間任務

由於線程池的默認大小是有限的,如果存在一個耗時很長的任務,會佔用線程池的大部分線程,導致其他任務等待執行。

可以將長時間任務分成多個小任務,並使用異步方式執行,以便在等待長時間任務完成時釋放線程池中的線程。

for (int i = 0; i 
    {
        // DoSomeWork()是一個耗時很長的方法
        var result = DoSomeWork();
        // 執行完小任務之後,釋放線程池中的線程
    });
}

3、避免線程池阻塞

線程池中的每個線程默認都是前台線程,會保持程序運行。當調用某些方法時,如Thread.Sleep()或 Thread.Join(),會產生阻塞線程池的效果。

為了避免線程池被阻塞,可以創建一個後台線程,代替前台線程,使用ManualResetEvent.WaitOne()方法等待。

static void Main(string[] args)
{
    var resetEvent = new ManualResetEvent(false);
    var thread = new Thread(() =>
    {
        // DoSomethingLong();
        resetEvent.Set();
    }) { IsBackground = true };
    thread.Start();
    resetEvent.WaitOne();
}

四、線程池使用場景

線程池適用於需要執行大量可以異步執行的任務的情況。常見的應用包括:網絡套接字通信的異步執行、大量文件I / O異步執行、在多個客戶端中異步執行長時間操作以提高Web服務器吞吐量等。

五、參考鏈接

c#線程池:https://docs.microsoft.com/en-us/dotnet/api/system.threading.threadpool?view=net-5.0

c#線程池介紹:https://www.cnblogs.com/hanyinglong/p/6913031.html

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/287350.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-23 13:07
下一篇 2024-12-23 13:07

相關推薦

  • Python線程等待指南

    本文將從多個方面詳細講解Python線程等待的相關知識。 一、等待線程結束 在多線程編程中,經常需要等待線程執行完畢再進行下一步操作。可以使用join()方法實現等待線程執行完畢再…

    編程 2025-04-29
  • Python兩個線程交替打印1到100

    這篇文章的主題是關於Python多線程的應用。我們將會通過實際的代碼,學習如何使用Python兩個線程交替打印1到100。 一、創建線程 在Python中,我們可以使用Thread…

    編程 2025-04-28
  • ROS線程發布消息異常解決方法

    針對ROS線程發布消息異常問題,我們可以從以下幾個方面進行分析和解決。 一、檢查ROS代碼是否正確 首先,我們需要檢查ROS代碼是否正確。可能會出現的問題包括: 是否正確初始化RO…

    編程 2025-04-28
  • Python線程池並發爬蟲

    Python線程池並發爬蟲是實現多線程爬取數據的常用技術之一,可以在一定程度上提高爬取效率和數據處理能力。本文將從多個方面對Python線程池並發爬蟲做詳細的闡述,包括線程池的實現…

    編程 2025-04-27
  • 線程池中的一個線程異常了會被怎麼處理

    本文將從以下幾個方面對線程池中的一個線程異常了會被怎麼處理進行詳細闡述:異常的類型、如何捕獲異常、異常的處理方式。 一、異常的類型 在線程池中,可以出現多種類型的異常,例如線程執行…

    編程 2025-04-27
  • Linux sync詳解

    一、sync概述 sync是Linux中一個非常重要的命令,它可以將文件系統緩存中的內容,強制寫入磁盤中。在執行sync之前,所有的文件系統更新將不會立即寫入磁盤,而是先緩存在內存…

    編程 2025-04-25
  • 神經網絡代碼詳解

    神經網絡作為一種人工智能技術,被廣泛應用於語音識別、圖像識別、自然語言處理等領域。而神經網絡的模型編寫,離不開代碼。本文將從多個方面詳細闡述神經網絡模型編寫的代碼技術。 一、神經網…

    編程 2025-04-25
  • Linux修改文件名命令詳解

    在Linux系統中,修改文件名是一個很常見的操作。Linux提供了多種方式來修改文件名,這篇文章將介紹Linux修改文件名的詳細操作。 一、mv命令 mv命令是Linux下的常用命…

    編程 2025-04-25
  • Python輸入輸出詳解

    一、文件讀寫 Python中文件的讀寫操作是必不可少的基本技能之一。讀寫文件分別使用open()函數中的’r’和’w’參數,讀取文件…

    編程 2025-04-25
  • nginx與apache應用開發詳解

    一、概述 nginx和apache都是常見的web服務器。nginx是一個高性能的反向代理web服務器,將負載均衡和緩存集成在了一起,可以動靜分離。apache是一個可擴展的web…

    編程 2025-04-25

發表回復

登錄後才能評論