2016-10-27 12 views
1

私のアプリケーションでは、メッセージとイベントが呼び出されます。イベントはライブラリで定義されているので、私は購読することしかできません。.NETでのタスク管理

consumer.Received += (model, ea) => new Task(() => 
{ 
    var body = ea.Body; 
    var message = Encoding.UTF8.GetString(body); 
    Console.WriteLine(message); 
}).Start(); 

メッセージを受信したときに新しいタスクを実行します。しかし、それは非常に大きな量のメッセージと実行中のタスクになることがあります。私が思うに、新しいTask().Start()を使用するとすぐに起動するので、システムが過負荷になる可能性があります。問題は、実行可能なタスク数が固定されたコンテナを作成せずにタスクを管理する方法です.Netに最大限の能力と信頼管理を使用したいからです。ありがとう。

答えて

1

ここで、タスクはスレッドプールにキューイングされ、そのヒューリスティックに基づいて実行されます。 .NET

うんへ

信託管理...ランタイムは、タスクのスケジューリングが最適であるかについての限られた情報を持っています。時にはあなたがコントロールする必要があります。特に、あなたがIOをしている場合。私はCPUの制限されたワークロードの経験が少ないですが、デフォルトのスケジューリングではもっとうまくいくはずです。

サンプルコードがどのように実際の作業負荷であるかがはっきりしていないので、何か具体的なことはお勧めできません。これがIOベースの場合は、スレッドプールヒューリスティックに頼るべきではありません。 TPLはあなたのIOデバイスが何をすることができるか分かりません。

ここでは、(サンプルコードで)非同期IOを使用していないため、抽象度がTaskSchedulerであるため、制御したい場合に並列度が制限されているタスクスケジューラを作成できます。

現実的な作業負荷をテストするのが最も良いでしょう。余りにも多くのスレッドが作成されていることがわかったら、並列性の程度を正常な値に制限することができます。

関連する問題