0

私の質問は少しナイーブに聞こえるかもしれませんが、私はマルチスレッド プログラミングの初心者です。

着信外部データを処理するアプリケーションを作成しています。到着するデータごとに、次の方法で新しいタスクが作成されます。

System.Threading.Tasks.Task.Factory.StartNew(() => methodToActivate(data));

データの項目は非常に速く (毎秒、0.5 秒など) 到着するため、多くのタスクが作成されます。各タスクの処理には約 1 分かかる場合があります。テストすると、スレッドの数が常に増加していることがわかりました。実際に動作するスレッドの数が安定して効率的になるように、作成されるタスクの数を制限するにはどうすればよいですか。私のコンピューターはデュアルコアのみです。

ありがとう!

4

3 に答える 3

2

問題の 1 つは、既定のスケジューラが 1 分間続くタスクを認識し、まだ実行されていない別のタスクでブロックされていると想定することです。ブロックを解除しようとするために、より多くの保留中のタスクがスケジュールされるため、スレッドが大きくなります。ここでできることはいくつかあります。

  • タスクを短くします (おそらくオプションではありません)。

  • このシナリオを処理し、スレッドを追加しないスケジューラを作成します。

  • SetMaxThreads を使用して、無制限のスレッド プールの成長を防ぎます。

こちらのスレッド インジェクションに関するセクションを参照してください。

http://msdn.microsoft.com/en-us/library/ff963549.aspx

于 2011-03-24T18:37:37.000 に答える
0

TaskSchedulerタスク並列ライブラリのカスタムを作成し、そのインスタンスをTaskFactoryコンストラクターに渡すことで、そのライブラリでタスクをスケジュールできます。

これを行う方法の一例を次に示します。最大の並列処理を備えたタスクスケジューラ

于 2010-11-25T07:53:58.460 に答える
0

ワークロードの特性を考慮して、 を何かに設定する前後にプロデューサー/コンシューマー パターンを使用することを検討する必要があります。構成可能にしてから、いくつかのプロファイリング セッションを実行しながら微調整して、スイート スポットを見つけることができます。BlockingCollection<T>ConcurrentQueue<T>BoundedCapacityBoundedCapacity

作成したタスクをキューに入れるのは TPL が処理するのは事実ですが、あまりにも多くのタスクを作成するとペナルティーが発生するわけではありません。また、自分が消費できるよりも多くの作業を生成することに何の意味があるのでしょうか? コンシューマが飢えないように十分な作業を生成したいのですが、リソースを浪費し、コンシューマからまったく同じリソースを盗む可能性があるため、自分よりもはるかに先に進みたくありません。

于 2010-11-02T04:04:29.487 に答える