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 という名前のメソッドをキューに入れ、1 秒間スリープ状態にしてから終了します。 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 メソッドの呼び出しをコメント アウトすると、スレッド プール スレッドでメソッドが実行される前にメイン スレッドが終了します。 スレッド プールはバックグラウンド スレッドを使用します。これは、すべてのフォアグラウンド スレッドが終了してもアプリケーションの実行を維持しません。 (これは、競合状態の単純な例です)。

注釈

多くのアプリケーションは、スリープ状態で多くの時間を費やし、イベントが発生するのを待つスレッドを作成します。 他のスレッドは、変更または更新の状態情報をポーリングするために定期的に起動されるためだけにスリープ状態になる場合があります。 スレッド プールを使用すると、システムによって管理されるワーカー スレッドのプールをアプリケーションに提供することで、スレッドをより効率的に使用できます。 スレッド プール スレッドを使用する操作の例を次に示します。

  • 何らかのタスクを非同期的に実行する Task または Task<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 メソッドを呼び出します。 このメソッドは、スレッド プールから選択されたスレッドによって呼び出されるメソッドまたはデリゲートへの参照をパラメーターとして受け取ります。 キューに登録された作業項目を取り消す方法はありません。

タイマー キュー タイマーと登録済み待機操作もスレッド プールを使用します。 コールバック関数は、スレッド プールにキューに入れられます。

プロセスごとに 1 つのスレッド プールがあります。 .NET Framework 4 以降では、プロセスのスレッド プールの既定のサイズは、仮想アドレス空間のサイズなど、いくつかの要因によって異なります。 プロセスは、 GetMaxThreads メソッドを呼び出してスレッドの数を決定できます。 スレッド プール内のスレッドの数は、 SetMaxThreads メソッドを使用して変更できます。 各スレッドは既定のスタック サイズを使用し、既定の優先順位で実行されます。

Note

.NET Framework をホストするアンマネージ コードでは、mscoree.h ファイルで定義されている CorSetMaxThreads 関数を使用して、スレッド プールのサイズを変更できます。

スレッド プールは、各カテゴリの最大値に達するまで、新しいワーカー スレッドまたは I/O 完了スレッドをオンデマンドで提供します。 最大値に達すると、スレッド プールはそのカテゴリに追加のスレッドを作成するか、一部のタスクが完了するまで待機できます。 .NET Framework 4 以降では、スレッド プールは、スループットを最適化するためにワーカー スレッドを作成および破棄します。これは、時間単位で完了するタスクの数として定義されます。 使用可能なリソースを最適に使用できないスレッドが少なすぎるのに対し、スレッドの数が多すぎるとリソースの競合が増加する可能性があります。

Note

需要が低い場合、スレッド プール スレッドの実際の数が最小値を下回る可能性があります。

GetMinThreadsメソッドを使用して、これらの最小値を取得できます。

Caution

SetMinThreadsメソッドを使用して、スレッドの最小数を増やすことができます。 ただし、これらの値を不必要に増やすと、パフォーマンスの問題が発生する可能性があります。 同時に開始するタスクが多すぎると、すべてのタスクが遅いように見える可能性があります。 ほとんどの場合、スレッド プールは、スレッドを割り当てる独自のアルゴリズムでパフォーマンスが向上します。

メソッド

名前 説明
BindHandle(IntPtr)
古い.

オペレーティング システム ハンドルを ThreadPoolにバインドします。

BindHandle(SafeHandle)

オペレーティング システム ハンドルを 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)

タイムアウトの 32 ビット符号付き整数をミリ秒単位で指定して、 WaitHandleを待機するデリゲートを登録します。

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

タイムアウトの 64 ビット符号付き整数をミリ秒単位で指定して、 WaitHandleを待機するデリゲートを登録します。

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

タイムアウトのTimeSpan値を指定して、WaitHandleを待機するデリゲートを登録します。

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

タイムアウトの 32 ビット符号なし整数をミリ秒単位で指定して、 WaitHandleを待機するデリゲートを登録します。

SetMaxThreads(Int32, Int32)

同時にアクティブにできるスレッド プールへの要求の数を設定します。 その数を超えるすべての要求は、スレッド プール スレッドが使用可能になるまでキューに残ります。

SetMinThreads(Int32, Int32)

スレッドの作成と破棄を管理するためのアルゴリズムに切り替える前に、新しい要求が行われるとき、スレッド プールが必要に応じて作成するスレッドの最小数を設定します。

UnsafeQueueNativeOverlapped(NativeOverlapped*)

重複した I/O 操作をキューに入れ、実行します。

UnsafeQueueUserWorkItem(WaitCallback, Object)

指定したデリゲートをスレッド プールにキューに入れますが、呼び出し履歴はワーカー スレッドに伝達されません。

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

タイムアウト (ミリ秒単位) の 32 ビット符号付き整数を使用して、 WaitHandleを待機するデリゲートを登録します。 このメソッドは、呼び出し履歴をワーカー スレッドに伝達しません。

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

タイムアウトの 64 ビット符号付き整数をミリ秒単位で指定して、 WaitHandleを待機するデリゲートを登録します。 このメソッドは、呼び出し履歴をワーカー スレッドに伝達しません。

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

タイムアウトのTimeSpan値を指定して、WaitHandleを待機するデリゲートを登録します。このメソッドは、呼び出し履歴をワーカー スレッドに伝達しません。

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

タイムアウトの 32 ビット符号なし整数をミリ秒単位で指定して、 WaitHandleを待機するデリゲートを登録します。 このメソッドは、呼び出し履歴をワーカー スレッドに伝達しません。

適用対象

スレッド セーフ

この型はスレッド セーフです。

こちらもご覧ください