ThreadPool 類別

定義

提供執行緒的集區,可用來執行工作、張貼工作項目、處理非同步 I/O、代表其他執行緒等候,以及處理計時器。

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

範例

在下列範例中,主要應用程式執行緒會將名為 的方法排入佇列 ThreadProc ,以線上程集區執行緒上執行、睡眠一秒,然後結束。 方法 ThreadProc 只會顯示訊息。

using namespace System;
using namespace System::Threading;

ref class Example
{
public:

   // This thread procedure performs the task.
   static void ThreadProc(Object^ stateInfo)
   {
      
      // No state object was passed to QueueUserWorkItem, so stateInfo is 0.
      Console::WriteLine( "Hello from the thread pool." );
   }
};

int main()
{
   // Queue the task.
   ThreadPool::QueueUserWorkItem(gcnew WaitCallback(Example::ThreadProc));

   Console::WriteLine("Main thread does some work, then sleeps.");
   
   Thread::Sleep(1000);
   Console::WriteLine("Main thread exits.");
   return 0;
}
// The example displays output like the following:
//       Main thread does some work, then sleeps.
//       Hello from the thread pool.
//       Main thread exits.
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) 方法,將實際資料傳遞至委派。

注意

Managed 執行緒集區中的執行緒是背景執行緒。 也就是說,其 IsBackground 屬性為 true 。 這表示 ThreadPool 在結束所有前景執行緒之後,執行緒不會讓應用程式繼續執行。

重要

當執行緒集區重複使用執行緒時,它不會清除執行緒本機儲存體或以 ThreadStaticAttribute 屬性標示的欄位中的資料。 因此,當方法檢查以 屬性標示 ThreadStaticAttribute 的執行緒本機儲存區或欄位時,其找到的值可能會離開先前使用執行緒集區執行緒的值。

您也可以將與執行緒集區等候作業無關的工作專案排入佇列。 若要要求執行緒集區中的執行緒工作專案,請呼叫 QueueUserWorkItem 方法。 這個方法會採用參數,作為從執行緒集區選取之執行緒所呼叫之方法或委派的參考。 在工作專案已排入佇列之後,就無法取消工作專案。

計時器佇列計時器和已註冊的等候作業也會使用執行緒集區。 其回呼函式會排入執行緒集區。

每個進程都有一個執行緒集區。 自 .NET Framework 4 起,處理序的執行緒集區預設大小取決於數個因素,例如虛擬位址空間的大小。 處理序可以呼叫 GetMaxThreads 方法來決定執行緒數目。 執行緒集區中的執行緒數目可以使用 方法來變更 SetMaxThreads 。 每個執行緒都會使用預設堆疊大小,並以預設優先順序執行。

注意

裝載.NET Framework的 Unmanaged 程式碼可以使用 mscoree.h 檔案中定義的 函式來變更執行緒集 CorSetMaxThreads 區的大小。

執行緒集區會視需要提供新的背景工作執行緒或 I/O 完成執行緒,直到達到每個類別的最大值為止。 達到最大值時,執行緒集區可以在該類別中建立其他執行緒,或等到某些工作完成為止。 自 .NET Framework 4 起,執行緒集區會建立及終結背景工作執行緒,以最佳化輸送量。輸送量是指每個時間單位所能完成的工作數。 執行緒太少可能無法最有效地利用可用資源,而執行緒太多則可能增加資源爭用的情況。

注意

當需求很低時,執行緒集區執行緒的實際數目可能低於最小值。

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

警告

您可以使用 SetMinThreads 方法來增加執行緒數目下限。 不過,不必要地增加這些值,可能會造成效能問題。 如果太多工作同時啟動,則所有工作可能都會變慢。 在大部分情況下,執行緒集區使用自己的演算法來配置執行緒的效能較佳。

屬性

CompletedWorkItemCount

取得目前已經處理完成的工作項目數。

PendingWorkItemCount

取得目前已排入佇列,等待處理的工作項目數。

ThreadCount

取得目前存在的執行緒集區執行緒數。

方法

BindHandle(IntPtr)
已淘汰.
已淘汰.

可將作業系統的控制代碼繫結至 ThreadPool

BindHandle(SafeHandle)

可將作業系統的控制代碼繫結至 ThreadPool

GetAvailableThreads(Int32, Int32)

擷取 GetMaxThreads(Int32, Int32) 方法所傳回之執行緒集區的執行緒最大數目,與目前作用中數目之間的差異。

GetMaxThreads(Int32, Int32)

擷取可並行使用之執行緒集區的要求數目。 超過該數目的所有要求會繼續佇列,直到可以使用執行緒集區執行緒為止。

GetMinThreads(Int32, Int32)

在切換至管理執行緒建立和解構的演算法之前,擷取執行緒集區隨著提出新要求,視需要建立的執行緒最小數目。

QueueUserWorkItem(WaitCallback)

將方法排入佇列,以等候執行。 可以使用執行緒集區執行緒時,即可執行這個方法。

QueueUserWorkItem(WaitCallback, Object)

將方法排入佇列,以等候執行,並指定包含這個方法所要使用之資料的物件。 可以使用執行緒集區執行緒時,即可執行這個方法。

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

Action<T> 委派指定的方法排入佇列以便執行,並提供將由方法使用的資料。 可以使用執行緒集區執行緒時,即可執行這個方法。

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

指定 32 位元帶正負號的整數表示逾時值 (以毫秒為單位),藉此註冊要等候 WaitHandle 的委派。

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

指定 64 位元帶正負號的整數表示逾時值 (以毫秒為單位),藉此註冊要等候 WaitHandle 的委派。

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

指定 WaitHandle 值表示逾時值,藉此註冊要等候 TimeSpan 的委派。

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

指定 32 位元帶正負號的整數表示逾時值 (以毫秒為單位),藉此註冊要等候 WaitHandle 的委派。

SetMaxThreads(Int32, Int32)

設定可並行使用之執行緒集區的要求數目。 超過該數目的所有要求會繼續佇列,直到可以使用執行緒集區執行緒為止。

SetMinThreads(Int32, Int32)

在切換至管理執行緒建立和解構的演算法之前,設定執行緒集區隨著提出新要求,視需要建立的執行緒最小數目。

UnsafeQueueNativeOverlapped(NativeOverlapped*)

將重疊的 I/O 作業排入佇列,以等候執行。

UnsafeQueueUserWorkItem(IThreadPoolWorkItem, Boolean)

將指定的工作項目物件排入執行緒集區。

UnsafeQueueUserWorkItem(WaitCallback, Object)

將指定的委派排入執行緒集區的佇列,但不會將呼叫堆疊傳播至背景工作執行緒。

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

Action<T> 指定的方法排入佇列以便執行,並指定包含這個方法所要使用之資料的物件。 可以使用執行緒集區執行緒時,即可執行這個方法。

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

使用 32 位元帶正負號的整數表示逾時值 (以毫秒為單位),藉此註冊要等候 WaitHandle 的委派。 這個方法不會將呼叫堆疊傳播至背景工作執行緒。

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

指定 64 位元帶正負號的整數表示逾時值 (以毫秒為單位),藉此註冊要等候 WaitHandle 的委派。 這個方法不會將呼叫堆疊傳播至背景工作執行緒。

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

指定 WaitHandle 值表示逾時值,藉此註冊要等候 TimeSpan 的委派。這個方法不會將呼叫堆疊傳播至背景工作執行緒。

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

指定 32 位元帶正負號的整數表示逾時值 (以毫秒為單位),藉此註冊要等候 WaitHandle 的委派。 這個方法不會將呼叫堆疊傳播至背景工作執行緒。

適用於

執行緒安全性

此型別具備執行緒安全。

另請參閱