ThreadPool 類別

定義

提供一個執行緒池,可用於執行任務、後續工作項目、處理非同步 I/O、代表其他執行緒等待,以及程序計時器。

public ref class ThreadPool sealed
public ref class ThreadPool abstract sealed
public sealed class ThreadPool
public static class ThreadPool
type ThreadPool = class
Public NotInheritable Class ThreadPool
Public Class ThreadPool
繼承
ThreadPool

範例

以下範例中,主應用程式執行緒排隊一個名為 ThreadProc 執行的方法,在執行緒池執行緒中執行,休眠一秒後退出。 此 ThreadProc 方法僅顯示訊息。

using System;
using System.Threading;

public class Example 
{
    public static void Main() 
    {
        // Queue the task.
        ThreadPool.QueueUserWorkItem(ThreadProc);
        Console.WriteLine("Main thread does some work, then sleeps.");
        Thread.Sleep(1000);

        Console.WriteLine("Main thread exits.");
    }

    // This thread procedure performs the task.
    static void ThreadProc(Object stateInfo) 
    {
        // No state object was passed to QueueUserWorkItem, so stateInfo is null.
        Console.WriteLine("Hello from the thread pool.");
    }
}
// The example displays output like the following:
//       Main thread does some work, then sleeps.
//       Hello from the thread pool.
//       Main thread exits.
Imports System.Threading

Public Module Example
    Public Sub Main()
        ' Queue the work for execution.
        ThreadPool.QueueUserWorkItem(AddressOf ThreadProc)
        
        Console.WriteLine("Main thread does some work, then sleeps.")

        Thread.Sleep(1000)

        Console.WriteLine("Main thread exits.")
    End Sub

    ' This thread procedure performs the task.
    Sub ThreadProc(stateInfo As Object)
        ' No state object was passed to QueueUserWorkItem, so stateInfo is null.
        Console.WriteLine("Hello from the thread pool.")
    End Sub
End Module
' The example displays output like the following:
'       Main thread does some work, then sleeps.
'       Hello from the thread pool.
'       Main thread exits.

如果你註解該方法的呼叫 Thread.Sleep ,主執行緒會在執行緒池執行緒執行前退出。 執行緒池使用背景執行緒,若所有前景執行緒都已終止,則無法維持應用程式運行。 (這是一個簡單的競賽條件範例。)

備註

許多應用程式會建立執行緒,這些執行緒會花大量時間處於休眠狀態,等待事件發生。 其他執行緒可能進入睡眠狀態,但會定期被喚醒以輪詢變更或更新狀態資訊。 執行緒池透過提供由系統管理的工作執行緒池,讓你能更有效率地使用執行緒。 使用執行緒池執行緒的操作範例包括:

  • 當你建立TaskTask<TResult>一個物件來非同步執行某個任務時,預設該任務會排程在執行緒池執行緒上執行。

  • 非同步計時器使用執行緒池。 執行緒池執行緒會從 System.Threading.Timer 類別執行回調並從類別中引發事件 System.Timers.Timer

  • 當你使用註冊等待句柄時,系統執行緒會監控等待句柄的狀態。 當等待操作完成時,執行緒池中的工作執行緒會執行相應的回調函式。

  • 當你呼叫 QueueUserWorkItem 排隊方法在執行緒池執行緒時, 你透過將方法交給 WaitCallback 一個委派來達成這個目標。 代表有簽名

    void WaitCallback(Object state)
    
    Sub WaitCallback(state As Object)
    

    其中 state 是包含代理使用資料的物件。 實際資料可透過呼叫 QueueUserWorkItem(WaitCallback, Object) 方法傳遞給代理。

Note

受管理執行緒池中的執行緒是背景執行緒。 也就是說,它們 IsBackground 的性質為 true。 這表示 ThreadPool 執行緒在所有前景執行緒退出後,仍無法持續執行應用程式。

Important

當執行緒池重用執行緒時,不會清除執行緒本地儲存或標記為該 ThreadStaticAttribute 屬性的欄位中的資料。 因此,當方法檢查執行緒本地儲存或標記為 ThreadStaticAttribute 屬性的欄位時,所找到的值可能是先前使用執行緒池執行緒時遺留的。

你也可以將與等待操作無關的工作項目排隊到執行緒池。 若要請求由執行緒池中的執行緒處理工作項目,請呼叫該 QueueUserWorkItem 方法。 此方法的參數是執行緒從執行緒池中選擇的執行緒所呼叫的方法或代理。 工作項目排隊結束後,無法取消。

計時器佇列計時器和註冊等待操作也會使用執行緒池。 它們的回調函式會排隊到執行緒池。

每個程序只有一個執行緒池。 從 .NET Framework 4 開始,程序執行緒池的預設大小取決於多種因素,例如虛擬位址空間的大小。 進程可以呼叫 GetMaxThreads 方法來判斷線程數目。 可透過此 SetMaxThreads 方法改變執行緒池中的執行緒數量。 每個執行緒使用預設堆疊大小並以預設優先順序執行。

Note

承載 .NET Framework 的非管理程式碼可透過 mscoree.h 檔案中定義的 CorSetMaxThreads 函式來改變執行緒池大小。

執行緒池會依需求提供新的工作執行緒或 I/O 完成執行緒,直到每個類別達到最大值。 當達到最大值時,執行緒池可以在該類別中新增執行緒,或等待某些任務完成。 從 .NET Framework 4 開始,執行緒池會建立並銷毀工作執行緒,以優化吞吐量,吞吐量定義為單位時間內完成的任務數量。 線程太少可能無法充分利用可用的資源,而太多線程可能會增加資源爭用。

Note

當需求很低時,線程集區線程的實際數目可能會低於最小值。

您可以使用 GetMinThreads 方法來取得這些最小值。

Caution

你可以用這個 SetMinThreads 方法增加最少的線數。 不過,不必要地增加這些值可能會導致效能問題。 如果同時啟動太多任務,則所有工作可能看起來都很慢。 在大部分情況下,線程集區會使用自己的演算法來更好地配置線程。

方法

名稱 Description
BindHandle(IntPtr)
已淘汰.

將作業系統的 handle 綁定到 ThreadPool.

BindHandle(SafeHandle)

將作業系統的 handle 綁定到 ThreadPool.

GetAvailableThreads(Int32, Int32)

取回方法回傳 GetMaxThreads(Int32, Int32) 的最大執行緒池執行緒數與當前啟用執行緒數之間的差額。

GetMaxThreads(Int32, Int32)

擷取可同時啟用的執行緒池請求數量。 所有高於該數值的請求都會在佇列中,直到執行緒池執行緒可用為止。

GetMinThreads(Int32, Int32)

在切換到管理執行緒建立與銷毀執行緒的演算法前,擷取執行緒池按需產生的最低執行緒數。

QueueUserWorkItem(WaitCallback, Object)

排隊執行方法,並指定一個包含該方法資料的物件。 當執行緒池執行緒可用時,該方法會被執行。

QueueUserWorkItem(WaitCallback)

排隊執行一個方法。 當執行緒池執行緒可用時,該方法會被執行。

QueueUserWorkItem<TState>(Action<TState>, TState, Boolean)

排隊由代理指定的 Action<T> 方法執行,並提供該方法可用的資料。 當執行緒池執行緒可用時,該方法會被執行。

RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, Int32, Boolean)

註冊代理以等待 WaitHandle,指定一個 32 位元有符號的整數,以毫秒計時。

RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, Int64, Boolean)

註冊代理等待 WaitHandle,指定一個 64 位元有符號的整數作為以毫秒計的逾時。

RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, TimeSpan, Boolean)

註冊代理以等待 , WaitHandle指定 TimeSpan 逾時值。

RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, UInt32, Boolean)

註冊代理以等待 WaitHandle,指定一個 32 位元無符號整數作為以毫秒計的超時。

SetMaxThreads(Int32, Int32)

設定可同時啟用的請求數量。 所有高於該數值的請求都會在佇列中,直到執行緒池執行緒可用為止。

SetMinThreads(Int32, Int32)

設定執行緒池在新請求時需產生的最低執行緒數,然後切換至管理執行緒建立與銷毀的演算法。

UnsafeQueueNativeOverlapped(NativeOverlapped*)

排隊執行重疊的 I/O 操作。

UnsafeQueueUserWorkItem(WaitCallback, Object)

佇列指定的代理到執行緒池,但不會將呼叫堆疊傳播到工作執行緒。

UnsafeRegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, Int32, Boolean)

註冊代理等待 , WaitHandle使用一個 32 位元有號整數作為毫秒的逾時。 此方法不會將呼叫堆疊傳播到工作執行緒。

UnsafeRegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, Int64, Boolean)

註冊代理等待 WaitHandle,指定一個 64 位元有符號的整數作為以毫秒計的逾時。 此方法不會將呼叫堆疊傳播到工作執行緒。

UnsafeRegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, TimeSpan, Boolean)

註冊代理以等待 , WaitHandle指定 TimeSpan 逾時值。此方法不會將呼叫堆疊傳播到工作執行緒。

UnsafeRegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, UInt32, Boolean)

註冊代理以等待 WaitHandle,指定一個 32 位元無符號整數作為以毫秒計的超時。 此方法不會將呼叫堆疊傳播到工作執行緒。

適用於

執行緒安全性

此類型是安全線程。

另請參閱