fenri's diary

基本的には勉強し始めたC#のメモ。後は140字で収まらない駄文。

ThreadPoolの使い方

hreadPoolの使い方

// ThreadMethodをスレッドプールで実行できるように
    // WaitCallbackデリゲートを作成
    WaitCallback waitCallback = new WaitCallback(ThreadMethod);

    // スレッドプールに登録
    ThreadPool.QueueUserWorkItem(waitCallback, "A");
    ThreadPool.QueueUserWorkItem(waitCallback, "B");

連載.NETマルチスレッド・プログラミング入門:第2回 .NETにおけるマルチスレッドの実装方法を総括 (3/4) - @IT

ThreadPool.QueueUserWorkItemメソッド(静的メソッド)を実行すると、
スレッドプールのキューにThreadMethodメソッドの実行指令が登録されることになる。
後は、スレッドプール内のスレッドが自動的にスケジューリングされ、
登録された実行指令が次々と実行されていく。

ThreadPool.QueueUserWorkItemメソッドの第2パラメータには、
object型のパラメータを指定することができる。
このパラメータについての型チェックなどは行われないが、
これを利用することによって、スレッドプールにより実行されるメソッドにパラメータを渡すことができる。
今回のサンプルでは、“A”と“B”という文字列を渡している。

ThreadPoolクラスを使って同時に実行できるスレッドの最大数は、
1つのプロセス当たり「プロセッサ数×25」と決められており、
同時に実行できるスレッドの残りの数は
ThreadPool.GetAvailableThreadsメソッドで取得できる。

using System;
using System.Threading;

public class List2
{
  public static void Main()
  {
    // ThreadMethodをスレッドプールで実行できるように
    // WaitCallbackデリゲートを作成
    WaitCallback waitCallback
      = new WaitCallback(ThreadMethod); // (1)

    // スレッドプールに登録
    ThreadPool.QueueUserWorkItem(waitCallback, "A"); // (2)
    ThreadPool.QueueUserWorkItem(waitCallback, "B"); // (3)

    //何かキーが押されるまで、プログラムを実行
    Console.ReadLine();
  }

  // 別スレッドで動作させるメソッド
  private static void ThreadMethod(object state) // (4)
  {
    for (int i = 0; i < 100; i++)
    {
      Thread.Sleep(5);
      Console.Write(" {0} ", state);
    }
  }
}