こんにちは、私は Task.Factory.StartNew に縛られています。誰かが私に次のコードを書くことを提案したことを思いついたのと同じように。
bool exitLoop = false;
while (!exitLoop)
{
exitLoop = true;
var messages = Queue.GetMessages(20);
foreach (var message in messages)
{
exitLoop = false;
Task.Factory.StartNew(() =>
{
DeliverMessage(message);
});
}
}
理論的には、これは一度に 20 個のメッセージをキューから排出し、キュー内のすべてのメッセージに対して Task を作成しようとします。したがって、キューに 1000 のメッセージがある場合、瞬時に 25 のタスクがあり、すべてのメッセージを処理します。以前はこれを理解していると思っていましたが、エントリがなくなるとStartNewがブロックされると思っていました-昔は〜25でした.しかし、これが.net 4.5であることを考えると、プールは今かなり高いです。私を困惑させているのは、プールが新しいタスクでいっぱいになり、ブロックを開始すると想定していたことです。つまり、すぐに 1000 のタスクが実行されています。プールの制限がほとんど制限されていないのに、なぜ 1000 タスクが表示されないのでしょうか?
[編集] さて、私が見ているのは、1000 個のタスクが実行中ではなく、実行のためにキューに入れられていることです。では、実行中/実行可能なタスクの数をどのように判断すればよいでしょうか?