ThreadPoolの動作方法についての私の理解が正しければ、その目的の1つは、特定の時間に作成できるプロセス内のワーカースレッドの数を制限することです。たとえば、MaxThreadsを5に設定してからQueueUserWorkItemを30回呼び出すと、ThreadPoolに対して30のリクエストが作成されますが、これらのリクエストのうち5つだけが新しいスレッドによって処理され、残りの25のリクエストはキューに追加されます。以前のリクエストが完了し、既存のスレッドが利用可能になると、一度に1つずつサービスが提供されます。
ただし、以下のコードでは、Thread.Sleep(-1)を呼び出すと、DoSomething()メソッドが返されないことが保証されます。つまり、現在のスレッドが後続のリクエストで使用できるようになることはありません。
しかし、ThreadPoolがどのように機能するかについての私の理解は正しくありません。なぜなら、それが正しければ、以下のコードは0〜29ではなく0〜4の数字のみを出力するからです。
誰かがThreadPoolがどのように機能するのか、そしてなぜ以下のコードが私が思っていたように動作しないのか説明してもらえますか?
static void DoSomething(object n)
{
Console.WriteLine(n);
Thread.Sleep(-1);
}
static void Main(string[] args)
{
ThreadPool.SetMaxThreads(5, 5);
for (int x = 0; x < 30; x++)
{
ThreadPool.QueueUserWorkItem(new WaitCallback(DoSomething), x);
}
Console.Read();
}