マネージド スレッド プールThe managed thread pool

System.Threading.ThreadPool クラスを使用すると、システムによって管理されるワーカー スレッドのプールがアプリケーションに提供されます。これを利用すると、開発者は、スレッド管理ではなくアプリケーション タスクに注意を集中できるようになります。The System.Threading.ThreadPool class provides your application with a pool of worker threads that are managed by the system, allowing you to concentrate on application tasks rather than thread management. バックグラウンド処理が必要な短いタスクがある場合、マネージド スレッド プールを使用すると、複数のスレッドを簡単に利用できます。If you have short tasks that require background processing, the managed thread pool is an easy way to take advantage of multiple threads. Framework 4 以降ではスレッド プールのスレッドで非同期タスクを実行する Task オブジェクトと Task<TResult> オブジェクトを作成できるため、スレッド プールが飛躍的に使いやすくなっています。Use of the thread pool is significantly easier in Framework 4 and later, since you can create Task and Task<TResult> objects that perform asynchronous tasks on thread pool threads.

.NET では、タスク並列ライブラリ (TPL)の操作、非同期 I/O 完了、タイマー コールバック、登録済みの待機操作、デリゲートを使用した非同期メソッド呼び出し、System.Net ソケット接続などのさまざまな目的でスレッド プールのスレッドを使用します。.NET uses thread pool threads for many purposes, including Task Parallel Library (TPL) operations, asynchronous I/O completion, timer callbacks, registered wait operations, asynchronous method calls using delegates, and System.Net socket connections.

スレッド プールの特徴Thread pool characteristics

スレッド プールのスレッドはバックグラウンド スレッドです。Thread pool threads are background threads. 各スレッドは、既定のスタック サイズを使用し、既定の優先順位で実行されます。また、各スレッドはマルチスレッド アパートメント内にあります。Each thread uses the default stack size, runs at the default priority, and is in the multithreaded apartment. タスクを完了したスレッド プール内のスレッドは待機スレッドのキューに戻ります。Once a thread in the thread pool completes its task, it's returned to a queue of waiting threads. 再利用はこの時点から可能です。From this moment it can be reused. これにより、タスクごとに新しいスレッドを作成するという負荷がアプリケーションにかからなくなります。This reuse enables applications to avoid the cost of creating a new thread for each task.

プロセスごとにスレッド プールが 1 つだけあります。There is only one thread pool per process.

スレッド プールのスレッドでの例外Exceptions in thread pool threads

スレッド プールのスレッドで未処理の例外が発生すると、プロセスが終了します。Unhandled exceptions in thread pool threads terminate the process. この規則には、次の 3 つの例外があります。There are three exceptions to this rule:

詳しくは、「マネージド スレッドの例外」をご覧ください。For more information, see Exceptions in Managed Threads.

スレッド プールのスレッドの最大数Maximum number of thread pool threads

スレッド プールのキューに登録できる操作の数は、使用可能なメモリによってのみ制限されます。The number of operations that can be queued to the thread pool is limited only by available memory. ただし、スレッド プールによって、プロセスで同時にアクティブにできるスレッドの数が制限されます。However, the thread pool limits the number of threads that can be active in the process simultaneously. すべてのスレッド プールのスレッドがビジー状態の場合、追加の作業項目は、それらを実行するスレッドが空くまでキューに登録されます。If all thread pool threads are busy, additional work items are queued until threads to execute them become available. .NET Framework 4 以降では、プロセスのスレッド プールの既定のサイズは、仮想アドレス空間のサイズなど、いくつかの要素によって決まります。Beginning with the .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. スレッドの数は、プロセスで ThreadPool.GetMaxThreads メソッドを呼び出せば確認できます。A process can call the ThreadPool.GetMaxThreads method to determine the number of threads.

スレッドの最大数を制御するには、ThreadPool.GetMaxThreads メソッドと ThreadPool.SetMaxThreads メソッドを使用します。You can control the maximum number of threads by using the ThreadPool.GetMaxThreads and ThreadPool.SetMaxThreads methods.

注意

共通言語ランタイムをホストするコードでは、ICorThreadpool::CorSetMaxThreads メソッドを使用してサイズを設定できます。Code that hosts the common language runtime can set the size using the ICorThreadpool::CorSetMaxThreads method.

スレッド プールの最小値Thread pool minimums

スレッド プールでは、カテゴリごとに指定された最小値に達するまで、要求に応じて新しいワーカー スレッドまたは I/O 完了スレッドが提供されます。The thread pool provides new worker threads or I/O completion threads on demand until it reaches a specified minimum for each category. これらの最小値は、ThreadPool.GetMinThreads メソッドを使用して取得できます。You can use the ThreadPool.GetMinThreads method to obtain these minimum values.

注意

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

スレッド プールの最小値に達すると、追加のスレッドが作成されるか、いくつかのタスクが完了するまで待機状態になります。When a minimum is reached, the thread pool can create additional threads or wait until some tasks complete. .NET Framework 4 以降では、スループットを最適化するために、スレッド プールでワーカー スレッドの作成と破棄が行われます。スループットは、タスクの単位時間あたりの完了数として定義されます。Beginning with the .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.

注意事項

アイドル スレッドの最小数は、ThreadPool.SetMinThreads メソッドを使用して増やすことができます。You can use the ThreadPool.SetMinThreads method to increase the minimum number of idle 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.

スレッド プールの使用Using the thread pool

.NET Framework 4 以降でスレッド プールを使用する場合は、タスク並列ライブラリ (TPL) を使用すると最も簡単です。Beginning with the .NET Framework 4, the easiest way to use the thread pool is to use the Task Parallel Library (TPL). TaskTask<TResult> などの TPL の型では、既定でスレッド プールのスレッドを使用してタスクが実行されます。By default, TPL types like Task and Task<TResult> use thread pool threads to run tasks.

また、マネージド コードから ThreadPool.QueueUserWorkItem (またはアンマネージド コードから ICorThreadpool::CorQueueUserWorkItem) を呼び出し、タスクを実行するメソッドを表す System.Threading.WaitCallback デリゲートを渡すことによってスレッド プールを使用することもできます。You can also use the thread pool by calling ThreadPool.QueueUserWorkItem from managed code (or ICorThreadpool::CorQueueUserWorkItem from unmanaged code) and passing a System.Threading.WaitCallback delegate representing the method that performs the task.

スレッド プールを使用するもう 1 つの方法として、待機操作の関連ワーク アイテムをキューに置く方法もあります。これには、ThreadPool.RegisterWaitForSingleObject メソッドを使用し、System.Threading.WaitHandle を渡します。その WaitHandle がシグナル状態になるかタイムアウトになると、System.Threading.WaitOrTimerCallback デリゲートによって表されるメソッドが呼び出されます。Another way to use the thread pool is to queue work items that are related to a wait operation by using the ThreadPool.RegisterWaitForSingleObject method and passing a System.Threading.WaitHandle that, when signaled or when timed out, calls the method represented by the System.Threading.WaitOrTimerCallback delegate. スレッド プールのスレッドを使用してコールバック メソッドが呼び出されます。Thread pool threads are used to invoke callback methods.

参照先の API ページを例としてご確認ください。For the examples, check the referenced API pages.

セキュリティ チェックのスキップSkipping security checks

スレッド プールでは、ThreadPool.UnsafeQueueUserWorkItem メソッドと ThreadPool.UnsafeRegisterWaitForSingleObject メソッドも使用できます。The thread pool also provides the ThreadPool.UnsafeQueueUserWorkItem and ThreadPool.UnsafeRegisterWaitForSingleObject methods. これらのメソッドは、呼び出し元のスタックが、キューに配置されているタスクの実行時に行われるセキュリティ チェックと無関係であることが確認できる場合にのみ使用します。Use these methods only when you are certain that the caller's stack is irrelevant to any security checks performed during the execution of the queued task. ThreadPool.QueueUserWorkItemThreadPool.RegisterWaitForSingleObject はどちらも呼び出し元のスタックを取り込みます。このスタックは、スレッドがタスクの実行を開始するときにスレッド プールのスレッドのスタックにマージされます。ThreadPool.QueueUserWorkItem and ThreadPool.RegisterWaitForSingleObject both capture the caller's stack, which is merged into the stack of the thread pool thread when the thread begins to execute a task. セキュリティ チェックが必要な場合は、そのスタック全体をチェックする必要があります。If a security check is required, the entire stack must be checked. チェックは安全性を提供しますが、パフォーマンスへの影響もあります。Although the check provides safety, it also has a performance cost.

スレッド プールのスレッドを使用しない場合When not to use thread pool threads

次のような場合は、スレッド プールのスレッドを使用する代わりに独自のスレッドを作成して管理する方が適切です。There are several scenarios in which it's appropriate to create and manage your own threads instead of using thread pool threads:

  • フォア グラウンド スレッドが必要な場合。You require a foreground thread.
  • スレッドに特定の優先順位を設定する必要がある場合。You require a thread to have a particular priority.
  • スレッドを長時間にわたってブロックするタスクがある場合。You have tasks that cause the thread to block for long periods of time. スレッド プールには最大数のスレッドが存在するため、多数のスレッド プール スレッドがブロックされると、タスクを開始できなくなることがあります。The thread pool has a maximum number of threads, so a large number of blocked thread pool threads might prevent tasks from starting.
  • スレッドをシングルスレッド アパートメント内に配置する必要がある場合。You need to place threads into a single-threaded apartment. ThreadPool スレッドはすべてマルチスレッド アパートメント内にあります。All ThreadPool threads are in the multithreaded apartment.
  • 安定した ID をスレッドに関連付ける必要がある場合、またはスレッドを特定のタスク専用にする必要がある場合。You need to have a stable identity associated with the thread, or to dedicate a thread to a task.

関連項目See also