エクスポート (0) 印刷
すべて展開
情報
要求されたトピックは次のとおりです。しかし、このトピックはこのライブラリには含まれていません。

ThreadPool クラス

2013/12/12

作業項目のポスト、非同期 I/O の処理、他のスレッドの代わりの待機、およびタイマーの処理に使用できるスレッドのプールを提供します。

System.Object
  System.Threading.ThreadPool

Namespace:  System.Threading
アセンブリ:  mscorlib (mscorlib.dll 内)

public static class ThreadPool

ThreadPool 型で公開されるメンバーは以下のとおりです。

  名前説明
パブリック メソッド静的メンバーGetMaxThreads同時にアクティブにできるスレッド プールへの要求の数を取得します。この数を超える要求はすべて、スレッド プールのスレッドが使用可能になるまでキューに置かれたままになります。
パブリック メソッド静的メンバーGetMinThreadsスレッド プールが新しい要求に応じるために保持するアイドル スレッド数を取得します。
パブリック メソッド静的メンバーQueueUserWorkItem(WaitCallback)メソッドを実行するためのキューに置きます。メソッドは、スレッド プールのスレッドが使用可能になったときに実行されます。
パブリック メソッド静的メンバーQueueUserWorkItem(WaitCallback, Object)実行するためのキューにメソッドを置き、そのメソッドが使用するデータを含んだオブジェクトを指定します。メソッドは、スレッド プールのスレッドが使用可能になったときに実行されます。
パブリック メソッド静的メンバー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セキュリティ クリティカル。 同時にアクティブにできるスレッド プールへの要求の数を設定します。この数を超える要求はすべて、スレッド プールのスレッドが使用可能になるまでキューに置かれたままになります。
パブリック メソッド静的メンバーSetMinThreadsセキュリティ クリティカル。 新しい要求に応じるためにスレッド プール内で保持されている、アイドル スレッドの数を設定します。
このページのトップへ

スレッド プールを使用すると、システムで管理されるワーカー スレッドのプールをアプリケーションに提供することで、スレッドをより効率的に使用できます。1 つのスレッドが、スレッド プールのキューに置かれた複数の待機操作のステータスを監視します。待機操作が完了すると、スレッド プールのワーカー スレッドは該当するコールバック関数を実行します。

メモメモ:

スレッド プールのスレッドで実行されるコードからユーザー インターフェイス要素にアクセスする必要がある場合、System.Windows.Threading.Dispatcher クラスを使用してユーザー インターフェイス スレッドでコードを実行します。

マネージ スレッド プールのスレッドは、バックグラウンド スレッドです。つまり、これらのスレッドの IsBackground プロパティは true です。

待機操作に関連のない作業項目をキューに置くこともできます。作業項目をスレッド プール内のスレッドで処理することを要求するには、QueueUserWorkItem メソッドを呼び出します。このメソッドは、スレッド プールから選択されたスレッドによって呼び出されるメソッドまたはデリゲートへの参照をパラメーターとして取得します。キューに置かれた作業項目はキャンセルできません。

タイマー待ちタイマーおよび登録された待機操作もスレッド プールを使用します。これらのコールバック関数は、スレッド プールのキューに置かれます。

プロセスごとに、1 つのスレッド プールがあります。スレッド プールの既定サイズは、ワーカー スレッドがプロセッサごとに 250 個、および I/O 完了スレッドが 1000 個です。

スレッド プールは、最少数のアイドル スレッドを維持します。ワーカー スレッドでは、この最小数の既定値はプロセッサ数です。GetMinThreads メソッドを使用すると、最小数のアイドル ワーカーと I/O 完了スレッドを取得できます。

スレッド プールのすべてのスレッドがタスクに割り当てられている場合、スレッド プールは新しいアイドル スレッドの作成をすぐには開始しません。スレッドのスタック領域の不要な割り当てを避けるために、新しいアイドル スレッドは間隔を置いて作成されます。この間隔は現在 0.5 秒ですが、.NET Framework の将来のバージョンでは変更される可能性があります。

スレッド プールがスレッドを再使用するとき、スレッド ローカル ストレージのデータや、ThreadStaticAttribute 属性でマークされているフィールドのデータはクリアされません。したがって、あるメソッドによってスレッド ローカル ストレージに配置されたデータが、同じスレッド プールのスレッドで実行される他のメソッドから参照される可能性があります。ThreadStaticAttribute 属性でマークされたフィールドにアクセスするメソッドは、どのスレッド プールのスレッドで実行されるかに応じて、異なるデータを参照する可能性があります。

TopicLocation
方法 : 非同期 HTTP ハンドラを作成するVisual Studio ASP .NET での Web アプリケーションの作成
方法 : 非同期 HTTP ハンドラを作成するVisual Studio ASP .NET での Web アプリケーションの作成
方法 : 非同期 HTTP ハンドラを作成するASP .NET Web アプリケーションの作成

次のコード例では、QueueUserWorkItem(WaitCallback) メソッドのオーバーロードを使用して、タスクをキューに配置します。これは、ThreadProc メソッドで表され、スレッドが使用可能になったときに実行されます。このオーバーロードには、タスク情報は指定していません。したがって、ThreadProc メソッドが使用できる情報は、このメソッドが属するオブジェクトに限定されます。

出力は、UI スレッドの TextBlock に表示されます。コールバック スレッドから TextBlock にアクセスするために、Dispatcher プロパティを使用して TextBlock 用の Dispatcher オブジェクトを取得した後、Dispatcher.BeginInvoke メソッドを使用してスレッド間呼び出しを実行しています。

メモメモ:

この例を実行するには、「Windows Phone での静的 TextBlock コントロールのあるコード例のビルド」を参照してください。


using System;
using System.Threading;

class Example
{
    // This is the UI element that receives the output from the example.
    private static System.Windows.Controls.TextBlock outputBlock;

    // The Demo method runs the example. It saves the TextBlock that is 
    // used for output, and sets up an event handler to start tasks.
    public static void Demo(System.Windows.Controls.TextBlock outputBlock)
    {
        Example.outputBlock = outputBlock;
        outputBlock.Text = "Click here to start a background task.\r\n";

        // Set up an event handler to start a task when the TextBlock 
        // is clicked.
        outputBlock.MouseLeftButtonUp += HandleMouseUp;
    }

    // Clicking the TextBlock queues a delegate to perform a task on a 
    // thread pool thread.
    private static void HandleMouseUp(object sender, 
                                      System.Windows.Input.MouseButtonEventArgs e)
    {
        ThreadPool.QueueUserWorkItem(AppendTextTask);

        // Note: The stateInfo object for the task in this example is
        // Nothing, because this overload of QueueUserWorkItem does not
        // take a stateInfo parameter. 
    }

    // This method performs the task, which is to append text to the
    // TextBlock. To communicate with objects on the UI thread, get the 
    // Dispatcher for one of the UI objects. Use the Dispatcher object's 
    // BeginInvoke method to queue a delegate that will run on the UI thread,
    // and therefore can safely access UI elements like the TextBlock.
    private static void AppendTextTask(object stateInfo)
    {
        outputBlock.Dispatcher.BeginInvoke(delegate () {
            outputBlock.Text += "Hello from the thread pool.\r\n";
        });
    }
}

/* This code produces output similar to the following:

Click here to start a background task.
Hello from the thread pool.
Hello from the thread pool.
Hello from the thread pool.
 */


Windows Phone OS

サポート: 8.0, 7.1, 7.0

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

表示:
© 2015 Microsoft