2012-01-30 17 views
10

私がやっている作業プロジェクトのタスク並列ライブラリの使い方を研究しています。長時間実行するタスクの長所と短所を理解したいと思います。実生活の例はまだありませんが、この背後にある理論を理解したいだけです。タスク並列ライブラリ - LongRunningタスクと複数の継続との比較

task schedulersとこのSO questionについては、ThreadPoolの外部にスレッドを作成しないようにできるだけ長く実行することを避けるのが最善の方法です。しかし、あなたはこれに代えて、完了するまでに長い時間がかかるとしていたタスクを持っていたと言う:

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

はあなたのような、試してみて、仕事の少ない、より速く単位に作業を分割し、タスクの継続を使用することができますこれは:

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

このアプローチは、もう少し有益なのでしょうか、それとも達成しようとしていることに対して過度のものでしょうか?

+0

本当に* long *の意味に依存します。 –

答えて

5
それは避けることが最善であるかのように、それは思わ

可能な限り長時間の作業

完全には正しくありません。必要な場合は、何らかの理由でスレッドを作成/割り当てしなければならない場合は、LongRunningオプションを使用したタスクがおそらく最適な選択です。このフラグは、タスクがスケジューラに予期できるようにしばらく時間がかかることを単にスケジューラに通知します。それはオプションを無視するかもしれない。

あなたは試してみて、あなたは、それを行うことができれば仕事の少ない、より速く単位

にあなたの仕事を分割でした。しかし、タクシーはそれほど簡単に分かれていません。

+0

私は、すべてのアルゴリズムを小さな塊に分割するのが簡単ではないことに同意します。しかし、もしできれば、それをする方が良いでしょうか?私はスケジューラが別のスレッドを作成するよりもTPLを利用するだろうと推測していますが、正しいのですか? –

+0

それは良いかもしれませんが、それは確かではありません。私はいつもあまり気にしません。余分なスレッドにつながるかどうかを知ることはできません。 –

3

ほとんど​​を指定すると、スレッドプールの外側から専用のスレッドが割り当てられます。

私は単にあなたの長時間実行タスクではなく、スレッドプールからのスレッドの別の専用のスレッド上で実行されますを確認しますBackgroundWorkerのクラスのために行くことをお勧め

+1

TaskCreationOptions.LongRunningは通常、専用のスレッドを作成します。 – dtb