1

こんにちは、私は 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 個のタスクが実行中ではなく、実行のためにキューに入れられていることです。では、実行中/実行可能なタスクの数をどのように判断すればよいでしょうか?

4

1 に答える 1

0

これはあなたの投稿からかなり時間が経っていることを知っていますが、これがあなたの特定の課題に直面している誰かの助けになることを願っています. あなたの最後のコメントは、「DeliverMessage」メソッドが HTTP リクエストを行っていると述べていました。

たとえば、「WebClient」オブジェクトを使用してリクエストを行う場合、ServicePointManager.DefaultConnectionLimitプロパティによってバインドされます。これは、ホストに対して最大 2 つの (デフォルトで) 同時接続を作成することを意味します。1,000 個の並列タスクを作成した場合、それらの 1,000 個すべてがこれら 2 つの接続によって処理される必要があります。

アプリケーションのスループットと Web サーバーの負荷の適切なバランスを見つけるには、この設定のさまざまな値を試してみる必要があります。

于 2014-07-17T16:47:37.750 に答える