1

私は、非常に多くの回数が立て続けに発生すると予想されるイベントをサブスクライブしている C# 4 アプリケーションを持っています。イベント スレッドが発生するたびに、イベント スレッドを実際にブロックしたくない作業を少し行う必要があります。

この作業の「チャンク」をバックグラウンド スレッド/タスクに渡し、イベント スレッドを続行できるようにする必要があるように感じますが、あまりにも多くのスレッドが作成されないようにする必要もあります。このイベントはすぐに何度も発生します。

イベント ハンドラーのワークロードをバックグラウンド スレッドに渡すが、作成されるスレッドの量を制限するための認識されたパターンまたは推奨されるアプローチはありますか?

これには Task Parallel Library を使用する何らかの方法があるはずですが、現時点で私が必要としているものを正確に実行するものは見つかりません。

これ以上の情報が必要な人がいたら教えてください。

ありがとう。

4

3 に答える 3

1

アプリの実行中にスレッドを作成しないでください。イベントが発生したときにタスクを作成 (またはデプール) し、それらをスレッドプールに送信/キューに入れます。

実際にスレッドを作成しない場合 (スレッド プールを提供するスレッドの起動時を除く)、スレッドを作成しすぎることはありません。

あまりにも多くのタスクを作成できますが、これを制限する他のメカニズムがあります (私は通常、起動時に固定数のタスクも作成しますが、スレッドの数よりもはるかに多く、BlockingCollection にプールし、popping/loading/実行中にサブミット/プッシュバックするため、データ/タスクフロー制御を提供します)。

于 2012-07-20T08:20:40.097 に答える
1

イベントが発生するたびに実行したい「少しの作業」が小さく、ほとんどが CPU バウンドである場合は、Task毎回 a を開始します。これThreadPoolにより、使用するスレッドの最適な数が決定されます。これは、使用している CPU コアの数に近い可能性が高くなります。この場合、並列度の制限について心配する必要はありません。

レイズごとの作業に時間がかかる場合、または大部分が IO バウンドである場合は、並列度を手動で制限する必要があります。これを行う 1 つの方法は、作業がない場合はブロックし、それ以外の場合はキューからのイベントを処理する少数のスレッドを用意することです。を使用してこれを実現できBlockingCollectionます。

.Net 4.5を使用できる場合、おそらく最良のオプションは、ActionBlockTPLデータフローをMaximumDegreeOfParallelismセットで使用することです。これにより、作業がないときにスレッドを無駄にすることがなく、使用する (または使用しない) スレッドの最大数を設定できます。

于 2012-07-20T10:50:29.637 に答える
0

ActionBlock と残りの TPL Dataflow は、CTP の形式で .NET 4 でも利用できます。

リモート Web サービスを呼び出した後に実行する必要がある他の作業がある場合は、データフロー ブロックを使用してパイプラインを作成することもできます (例: 結果の照合、ログの更新)。

于 2012-07-21T16:03:41.790 に答える