2016-10-05 3 views
3

タスクを使用するときに実際の並行性を制御できるようにするシナリオがいくつかあります。タスクの実際の並行性の制御

これは、サーバー側のAPIを負荷テストするための小さなクライアントを作成するときの良い例です。その場合は、いつでもX同時リクエストを希望します。

ここでTPLを使用すると、max degree of parallelismを設定できますが、これは同じではありません。 私は長時間実行されるタスクを使用して考えたが、私はそれはお勧めしません読んだものから:もちろん

https://social.msdn.microsoft.com/Forums/en-US/8304b44f-0480-488c-93a4-ec419327183b/when-should-a-taks-be-considered-longrunning?forum=parallelextensions

をTPLを使用して、実際の並行処理を実現するためのオプションがある場合、私は、スレッドの代わりにタスクを使用することができますが、私はそれを好むだろう。

+0

ここには多くの混乱があります。まず、処理される要求の最小数はどのように気になるのですか?マシンの速度が十分速ければ、同時に思うほど多くのタスクを実行する必要はありません。第2に、例えばParallel.Forと特定のDOP(例えば10)で正確な数値を指定できないようなものは何もありません。あなたはどこでもTaskを使う必要はなく、単なるプリミティブです。最後に、メッセージ/リクエストのストリームを処理するための最良のオプションは、TPL Dataflowの 'ActionBlock 'です。同時に処理するメッセージ数を指定できます。 –

+0

[ActionBlock](https://msdn.microsoft.com/en-us/library/hh194684(v = vs.110).aspx)のドキュメントでは、特定のDOPを持つActionBlockを作成してメッセージを投稿する方法を示しています。複数のブロックをパイプラインにリンクすることもできます(メッシュと呼ばれます) –

+0

ありがとう、私は質問について混乱しているのを見ません。プログラムの実行速度に関係なく、並行性を正確に制御したいと考えています。負荷テストでは、任意の時点でX同時呼び出しをしたいことがよくあります。私のテストでは、Parallel.ForのDOPも実際の並行性を制御しません。 ActionBlockの詳細については、ActionBlockを参照してください。 –

答えて

1

特定のコードを実行する数値スレッドを直接制御する場合は、TPLを使用しないでください。 TPLは、タスクインライン化と作業窃盗のようなフードの下で最適化を行っています。同時に正しいスレッド数を得ることができたとしても、予想される負荷量は生成されません。特に、タスクがhttpやwcfのような待ち時間の大半を費やしている場合。

おそらくセマフォで十分でしょう。

関連する問題