ThreadPool ThreadPool ThreadPool ThreadPool Class

定義

タスクの実行、作業項目のポスト、非同期 I/O の処理、他のスレッドの代理で行う待機、およびタイマーの処理に使用できるスレッドのプールを提供します。Provides a pool of threads that can be used to execute tasks, post work items, process asynchronous I/O, wait on behalf of other threads, and process timers.

public ref class ThreadPool abstract sealed
public static class ThreadPool
type ThreadPool = class
Public Class ThreadPool
継承
ThreadPoolThreadPoolThreadPoolThreadPool

次の例では、メイン アプリケーション スレッド キューという名前のメソッドThreadProcスリープ、1 秒間と終了し、スレッド プールのスレッド上で実行します。In the following example, the main application thread queues a method named ThreadProc to execute on a thread pool thread, sleeps for one second, and then exits. ThreadProcメソッドには、単にメッセージが表示されます。The ThreadProc method simply displays a message.

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メソッド、メソッドがスレッド プールのスレッドで実行する前に、メイン スレッドが終了しました。If you comment out the call to the Thread.Sleep method, the main thread exits before method runs on the thread pool thread. スレッド プールでは、アプリケーションのすべてのフォア グラウンド スレッドが終了した場合に実行を継続しないバック グラウンドのスレッドを使用します。The thread pool uses background threads, which do not keep the application running if all foreground threads have terminated. (これは、競合状態の簡単な例です)。(This is a simple example of a race condition.)

注釈

多くのアプリケーションでは、費やしません時間スリープの状態で発生するイベントを待機しているスレッドを作成します。Many applications create threads that spend a great deal of time in the sleeping state, waiting for an event to occur. 他のスレッドは、スリープ状態の変更をポーリングまたは状態情報を更新する定期的にスリープ解除する場合にのみを入力します。Other threads might enter a sleeping state only to be awakened periodically to poll for a change or update status information. スレッド プールでは、システムによって管理されているワーカー スレッドのプールを使用してアプリケーションを提供することでスレッドをより効率的に使用することができます。The thread pool enables you to use threads more efficiently by providing your application with a pool of worker threads that are managed by the system. スレッド プールのスレッドを使用して、操作の例を以下に示します。Examples of operations that use thread pool threads include the following:

  • 作成するときに、TaskまたはTask<TResult>スレッド プールのスレッドで実行するタスクをスケジュールする既定で非同期的にいくつかのタスクを実行するオブジェクト。When you create a Task or Task<TResult> object to perform some task asynchronously, by default the task is scheduled to run on a thread pool thread.

  • 非同期のタイマーは、スレッド プールを使用します。Asynchronous timers use the thread pool. スレッド プールのスレッドからのコールバックの実行、System.Threading.Timerクラスし、からのイベントを発生させる、System.Timers.Timerクラス。Thread pool threads execute callbacks from the System.Threading.Timer class and raise events from the System.Timers.Timer class.

  • 登録済みの待機ハンドルを使用すると、システム スレッドは待機ハンドルの状態を監視します。When you use registered wait handles, a system thread monitors the status of the wait handles. 待機操作が完了したら、スレッド プールからワーカー スレッドは、対応するコールバック関数を実行します。When a wait operation completes, a worker thread from the thread pool executes the corresponding callback function.

  • 呼び出すと、QueueUserWorkItemスレッド プールのスレッドで実行するためのメソッドをキューにします。When you call the QueueUserWorkItem method to queue a method for execution on a thread pool thread. メソッドに渡すことによって、これを行う、WaitCallbackを委任します。You do this by passing the method a WaitCallback delegate. デリゲートのシグネチャを持ちますThe delegate has the signature

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

    場所stateはデリゲートで使用されるデータを含むオブジェクトです。where state is an object that contains data to be used by the delegate. 実際のデータは、呼び出すことによって、デリゲートに渡すことができます、QueueUserWorkItem(WaitCallback, Object)メソッド。The actual data can be passed to the delegate by calling the QueueUserWorkItem(WaitCallback, Object) method.

注意

マネージ スレッド プール内のスレッドは、バック グラウンド スレッドです。The threads in the managed thread pool are background threads. つまり、そのIsBackgroundプロパティは、trueします。That is, their IsBackground properties are true. つまり、ThreadPoolスレッドはすべてのフォア グラウンド スレッドが終了した後に実行されるアプリケーションには保持されません。This means that a ThreadPool thread will not keep an application running after all foreground threads have exited.

重要

スレッド ローカル ストレージまたはでマークされているフィールドのデータは消去されません、スレッド プール スレッドを再利用、ときに、ThreadStaticAttribute属性。When the thread pool reuses a thread, it does not clear the data in thread local storage or in fields that are marked with the ThreadStaticAttribute attribute. そのため、メソッドがスレッド ローカル ストレージを検査またはフィールドが付いて、ThreadStaticAttribute属性、値が見つかる可能性があるから残されたスレッド プールのスレッドの以前の使用。Therefore, when a method examines thread local storage or fields that are marked with the ThreadStaticAttribute attribute, the values it finds might be left over from an earlier use of the thread pool thread.

また、スレッド プールに、待機操作に関連していない作業項目をキューできます。You can also queue work items that are not related to a wait operation to the thread pool. 作業項目をスレッド プール内のスレッドで処理することを要求するには、呼び出し、QueueUserWorkItemメソッド。To request that a work item be handled by a thread in the thread pool, call the QueueUserWorkItem method. このメソッドは、メソッドまたはスレッド プールから選択したスレッドで呼び出されるデリゲートへの参照をパラメーターとして受け取ります。This method takes as a parameter a reference to the method or delegate that will be called by the thread selected from the thread pool. キューに作業項目を取り消す手段はありません。There is no way to cancel a work item after it has been queued.

タイマー キューのタイマーと登録された待機操作もスレッド プールを使用します。Timer-queue timers and registered wait operations also use the thread pool. スレッド プールには、これらのコールバック関数がキューに登録します。Their callback functions are queued to the thread pool.

プロセスごとに 1 つのスレッド プールがあります。There is one thread pool per process. .NET Framework 4.NET Framework 4 以降では、プロセスのスレッド プールの既定のサイズは、仮想アドレス空間のサイズなど、いくつかの要素によって決まります。Beginning with the .NET Framework 4.NET Framework 4, the default size of the thread pool for a process depends on several factors, such as the size of the virtual address space. スレッドの数は、プロセスで GetMaxThreads メソッドを呼び出せば確認できます。A process can call the GetMaxThreads method to determine the number of threads. 使用して、スレッド プールのスレッド数を変更することができます、SetMaxThreadsメソッド。The number of threads in the thread pool can be changed by using the SetMaxThreads method. 各スレッドは、既定のスタック サイズを使用し、既定の優先順位で実行します。Each thread uses the default stack size and runs at the default priority.

注意

.NET Framework をホストするアンマネージ コードを使用してスレッド プールのサイズを変更することができます、 CorSetMaxThreads mscoree.h ファイルで定義されている関数。Unmanaged code that hosts the .NET Framework can change the size of the thread pool by using the CorSetMaxThreads function, defined in the mscoree.h file.

スレッド プールは、新しい worker スレッドまたは I/O 完了スレッド オンデマンドでカテゴリごとの最小値に達するまで。The thread pool provides new worker threads or I/O completion threads on demand until it reaches the minimum for each category. 以上に達すると、スレッド プールはそのカテゴリで追加のスレッドを作成または、いくつかのタスクを完了するまで待機できます。When a minimum is reached, the thread pool can create additional threads in that category or wait until some tasks complete. .NET Framework 4.NET Framework 4 以降では、スループットを最適化するために、スレッド プールでワーカー スレッドの作成と破棄が行われます。スループットは、タスクの単位時間あたりの完了数として定義されます。Beginning with the .NET Framework 4.NET Framework 4, the thread pool creates and destroys worker threads in order to optimize throughput, which is defined as the number of tasks that complete per unit of time. スレッドが少なすぎると使用可能なリソースが最適に使用されない可能性があり、スレッドが多すぎるとリソースの競合が増える可能性があります。Too few threads might not make optimal use of available resources, whereas too many threads could increase resource contention.

注意

要求が少ないときは、スレッド プールの実際のスレッド数が最小値を下回る場合があります。When demand is low, the actual number of thread pool threads can fall below the minimum values.

これらの最小値は、GetMinThreads メソッドを使用して取得できます。You can use the GetMinThreads method to obtain these minimum values.

注意事項

使用することができます、SetMinThreadsスレッドの最小数を増加させます。You can use the SetMinThreads method to increase the minimum number of threads. ただし、これらの値を必要以上に大きくすると、パフォーマンスの問題が発生する可能性があります。However, unnecessarily increasing these values can cause performance problems. 同時に開始するタスクの数が多すぎる場合は、すべてのタスクで処理速度が低下する可能性があります。If too many tasks start at the same time, all of them might appear to be slow. ほとんどの場合、スレッドを割り当てるためのスレッド プール独自のアルゴリズムを使用することでスレッド プールのパフォーマンスが向上します。In most cases the thread pool will perform better with its own algorithm for allocating threads.

メソッド

BindHandle(IntPtr) BindHandle(IntPtr) BindHandle(IntPtr) BindHandle(IntPtr)

オペレーティング システム ハンドルを ThreadPool にバインドします。Binds an operating system handle to the ThreadPool.

BindHandle(SafeHandle) BindHandle(SafeHandle) BindHandle(SafeHandle) BindHandle(SafeHandle)

オペレーティング システム ハンドルを ThreadPool にバインドします。Binds an operating system handle to the ThreadPool.

GetAvailableThreads(Int32, Int32) GetAvailableThreads(Int32, Int32) GetAvailableThreads(Int32, Int32) GetAvailableThreads(Int32, Int32)

スレッド プール スレッドの最大数 (GetMaxThreads(Int32, Int32) メソッドから返される) と現在アクティブなスレッドの数との差を取得します。Retrieves the difference between the maximum number of thread pool threads returned by the GetMaxThreads(Int32, Int32) method, and the number currently active.

GetMaxThreads(Int32, Int32) GetMaxThreads(Int32, Int32) GetMaxThreads(Int32, Int32) GetMaxThreads(Int32, Int32)

同時にアクティブにできるスレッド プールへの要求の数を取得します。Retrieves the number of requests to the thread pool that can be active concurrently. この数を超える要求はすべて、スレッド プール スレッドが使用可能になるまでキューに置かれたままになります。All requests above that number remain queued until thread pool threads become available.

GetMinThreads(Int32, Int32) GetMinThreads(Int32, Int32) GetMinThreads(Int32, Int32) GetMinThreads(Int32, Int32)

スレッドがオンデマンドで (新しい要求の発生ごとに) 作成するスレッド プールの数を取得します。この数を超えると、スレッドの作成と破棄を管理するためのアルゴリズムに切り替わります。Retrieves the minimum number of threads the thread pool creates on demand, as new requests are made, before switching to an algorithm for managing thread creation and destruction.

QueueUserWorkItem(WaitCallback) QueueUserWorkItem(WaitCallback) QueueUserWorkItem(WaitCallback) QueueUserWorkItem(WaitCallback)

メソッドを実行するためのキューに置きます。Queues a method for execution. メソッドは、スレッド プール スレッドが使用可能になったときに実行されます。The method executes when a thread pool thread becomes available.

QueueUserWorkItem(WaitCallback, Object) QueueUserWorkItem(WaitCallback, Object) QueueUserWorkItem(WaitCallback, Object) QueueUserWorkItem(WaitCallback, Object)

実行するためのキューにメソッドを置き、そのメソッドが使用するデータを含んだオブジェクトを指定します。Queues a method for execution, and specifies an object containing data to be used by the method. メソッドは、スレッド プール スレッドが使用可能になったときに実行されます。The method executes when a thread pool thread becomes available.

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

実行用に Action<T> デリゲートで指定したメソッドをキューに入れ、メソッドで使うデータを指定します。Queues a method specified by an Action<T> delegate for execution, and provides data to be used by the method. メソッドは、スレッド プール スレッドが使用可能になったときに実行されます。The method executes when a thread pool thread becomes available.

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

32 ビット符号なし整数でミリ秒単位のタイムアウトを指定して、WaitHandle を待機するデリゲートを登録します。Registers a delegate to wait for a WaitHandle, specifying a 32-bit unsigned integer for the time-out in milliseconds.

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

TimeSpan 値をタイムアウトとして指定して、WaitHandle を待機するデリゲートを登録します。Registers a delegate to wait for a WaitHandle, specifying a TimeSpan value for the time-out.

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

ミリ秒単位のタイムアウトとして 32 ビット符号付き整数を指定して、WaitHandle を待機するデリゲートを登録します。Registers a delegate to wait for a WaitHandle, specifying a 32-bit signed integer for the time-out in milliseconds.

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

64 ビット符号付き整数でミリ秒単位のタイムアウトを指定して、WaitHandle を待機するデリゲートを登録します。Registers a delegate to wait for a WaitHandle, specifying a 64-bit signed integer for the time-out in milliseconds.

SetMaxThreads(Int32, Int32) SetMaxThreads(Int32, Int32) SetMaxThreads(Int32, Int32) SetMaxThreads(Int32, Int32)

同時にアクティブにできるスレッド プールへの要求の数を設定します。Sets the number of requests to the thread pool that can be active concurrently. この数を超える要求はすべて、スレッド プール スレッドが使用可能になるまでキューに置かれたままになります。All requests above that number remain queued until thread pool threads become available.

SetMinThreads(Int32, Int32) SetMinThreads(Int32, Int32) SetMinThreads(Int32, Int32) SetMinThreads(Int32, Int32)

スレッドがオンデマンドで (新しい要求の発生ごとに) 作成するスレッド プールの数を設定します。この数を超えると、スレッドの作成と破棄を管理するためのアルゴリズムに切り替わります。Sets the minimum number of threads the thread pool creates on demand, as new requests are made, before switching to an algorithm for managing thread creation and destruction.

UnsafeQueueNativeOverlapped(NativeOverlapped*) UnsafeQueueNativeOverlapped(NativeOverlapped*) UnsafeQueueNativeOverlapped(NativeOverlapped*) UnsafeQueueNativeOverlapped(NativeOverlapped*)

重複した I/O 操作を、実行するためのキューに置きます。Queues an overlapped I/O operation for execution.

UnsafeQueueUserWorkItem(IThreadPoolWorkItem, Boolean) UnsafeQueueUserWorkItem(IThreadPoolWorkItem, Boolean) UnsafeQueueUserWorkItem(IThreadPoolWorkItem, Boolean) UnsafeQueueUserWorkItem(IThreadPoolWorkItem, Boolean)
UnsafeQueueUserWorkItem(WaitCallback, Object) UnsafeQueueUserWorkItem(WaitCallback, Object) UnsafeQueueUserWorkItem(WaitCallback, Object) UnsafeQueueUserWorkItem(WaitCallback, Object)

指定したデリゲートをスレッド プールのキューに置きます。ただし、コール スタックをワーカー スレッドに反映しません。Queues the specified delegate to the thread pool, but does not propagate the calling stack to the worker thread.

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

実行用に Action<T> デリゲートで指定したメソッドをキューに入れ、そのメソッドで使用するデータを含んだオブジェクトを指定します。Queues a method specified by an Action<T> delegate for execution, and specifies an object containing data to be used by the method. メソッドは、スレッド プール スレッドが使用可能になったときに実行されます。The method executes when a thread pool thread becomes available.

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

TimeSpan 値をタイムアウトとして指定して、WaitHandle を待機するデリゲートを登録します。このメソッドはコール スタックをワーカー スレッドに反映しません。Registers a delegate to wait for a WaitHandle, specifying a TimeSpan value for the time-out. This method does not propagate the calling stack to the worker thread.

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

ミリ秒単位のタイムアウトとして 32 ビット符号付き整数を使用して、WaitHandle を待機するデリゲートを登録します。Registers a delegate to wait for a WaitHandle, using a 32-bit signed integer for the time-out in milliseconds. このメソッドはコール スタックをワーカー スレッドに反映しません。This method does not propagate the calling stack to the worker thread.

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

64 ビット符号付き整数でミリ秒単位のタイムアウトを指定して、WaitHandle を待機するデリゲートを登録します。Registers a delegate to wait for a WaitHandle, specifying a 64-bit signed integer for the time-out in milliseconds. このメソッドはコール スタックをワーカー スレッドに反映しません。This method does not propagate the calling stack to the worker thread.

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

32 ビット符号なし整数でミリ秒単位のタイムアウトを指定して、WaitHandle を待機するデリゲートを登録します。Registers a delegate to wait for a WaitHandle, specifying a 32-bit unsigned integer for the time-out in milliseconds. このメソッドはコール スタックをワーカー スレッドに反映しません。This method does not propagate the calling stack to the worker thread.

適用対象

スレッド セーフ

この型はスレッド セーフです。This type is thread safe.

こちらもご覧ください