10

私は自分がやっている作業プロジェクトのためのタスク並列ライブラリの使用法を調査していて、長期実行タスクの長所/短所を理解したいと思います。実例はまだ持っていませんが、その背後にある理論を理解したいだけです。

MSDNのページから言うことからタスクスケジューラこのそう質問ThreadPoolの外部でスレッドを作成しないように、長時間実行されるタスクはできるだけ避けることが最善のようです。しかし、これではなく、完了までに時間がかかるようなタスクがあったとします。

Task.Factory.StartNew(() => DoTimeConsumingWork(), TaskCreationOptions.LongRunning)

このように、作業をもっと小さく、より速い作業単位に分割して、タスクの継続を使用してみてください。

Task.Factory
    .StartNew(() => DoWorkPart1())
    .ContinueWith(t => DoWorkPart2())
    .ContinueWith(t => DoWorkPart3())
    //...etc

このアプローチはもう少し有益なのでしょうか。


  • それは本当にあなたが何を意味するかに依存します長いです。 - user703016

2 답변


5

長時間実行されるタスクはできるだけ避けるのが最善のようです。

完全には正しくありません。あなたがそれを必要とするならば、あなたはどういうわけかスレッドを作る/割り当てる必要があるでしょう、そして次にLongRunningオプションを持つタスクはおそらく最良の選択です。このフラグは、スケジューラが予測できるように、タスクに時間がかかる可能性があることをスケジューラに通知するだけのものです。それはオプションを無視するかもしれません。

あなたの仕事をもっと小さく、より速い仕事の単位に分割してみてください。

できればそれをやりなさい。しかし、分別があるわけではありません。


  • 私は、すべてのアルゴリズムが非常に簡単に小さいチャンクに分割できるわけではないことに同意します。しかし、できればそうするほうがいいでしょうか?スケジューラが別のスレッドを作成するよりもTPLを上手く利用できると思いますが、正しいですか。 - Peter Monks
  • それはもっと良いかもしれませんが、それは確実ではありません。私はたいていあまり気にしないでください。余分なスレッドが発生するかどうかはわかりません(できません)。 - Henk Holterman

3

指定した場合TaskCreationOptions.LongRunningほとんどの場合、スレッドプールの外部から専用スレッドを割り当てます。

単に実行時間の長いタスクがスレッドプールからのスレッドではなく別の専用スレッドで実行されるようにするBackgroundWorkerクラスを使用することをお勧めします。


  • TaskCreationOptions.LongRunningは通常、専用のスレッドを作成させます。 - dtb

リンクされた質問


関連する質問

最近の質問