ThreadPool クラス

定義

タスクの実行、作業項目のポスト、非同期 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
継承
ThreadPool

次の例では、メインアプリケーションスレッドが、スレッドプールのスレッドで実行する 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. @No__t-0 メソッドは、単にメッセージを表示します。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.

@No__t-0 メソッドの呼び出しをコメントアウトすると、スレッドプールスレッドでメソッドが実行される前に、メインスレッドが終了します。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:

  • @No__t 0 または 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. スレッドプールスレッドは @no__t 0 クラスからコールバックを実行し、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.

  • @No__t-0 メソッドを呼び出して、スレッドプールのスレッドで実行するメソッドをキューに入れた場合。When you call the QueueUserWorkItem method to queue a method for execution on a thread pool thread. これを行うには、メソッドに @no__t 0 デリゲートを渡します。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. @No__t-0 メソッドを呼び出すことによって、実際のデータをデリゲートに渡すことができます。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. これは、すべてのフォアグラウンドスレッドが終了した後、@no__t 0 のスレッドがアプリケーションを実行したままにならないことを意味します。This means that a ThreadPool thread will not keep an application running after all foreground threads have exited.

重要

スレッドプールは、スレッドを再利用するときに、スレッドローカルストレージまたは @no__t 0 属性でマークされているフィールドのデータをクリアしません。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. したがって、メソッドがスレッドローカルストレージまたは @no__t 0 属性でマークされているフィールドを検査する場合、それが検出した値は、スレッドプールスレッドの以前の使用から残されている可能性があります。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 をホストするアンマネージコードは、mscoree.dll ファイルで定義されている @no__t 0 関数を使用して、スレッドプールのサイズを変更できます。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.

スレッドプールは、各カテゴリの最小値に達するまで、新しいワーカースレッドまたは 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.

注意事項

@No__t-0 メソッドを使用して、スレッドの最小数を増やすことができます。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.

プロパティ

CompletedWorkItemCount

これまでに処理された作業項目の数を取得します。Gets the number of work items that have been processed so far.

PendingWorkItemCount

処理するキューに置かれた現在の作業項目の数を取得します。Gets the number of work items that are currently queued to be processed.

ThreadCount

現在存在しているスレッド プールのスレッド数を取得します。Gets the number of thread pool threads that currently exist.

メソッド

BindHandle(IntPtr)

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

BindHandle(SafeHandle)

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

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)

同時にアクティブにできるスレッド プールへの要求の数を取得します。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)

スレッドがオンデマンドで (新しい要求の発生ごとに) 作成するスレッド プールの数を取得します。この数を超えると、スレッドの作成と破棄を管理するためのアルゴリズムに切り替わります。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)

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

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)

実行用に 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, 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)

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

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, UInt32, Boolean)

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

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)

スレッドがオンデマンドで (新しい要求の発生ごとに) 作成するスレッド プールの数を設定します。この数を超えると、スレッドの作成と破棄を管理するためのアルゴリズムに切り替わります。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*)

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

UnsafeQueueUserWorkItem(IThreadPoolWorkItem, Boolean)

指定された作業項目オブジェクトをスレッド プールのキューに入れます。Queues the specified work item object to the thread pool.

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)

実行用に 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, 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)

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, 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, 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.

こちらもご覧ください