複数の並列タスク。実行順序を指定して続行
-
26-09-2019 - |
質問
質問
これはおそらく私が見落としていた単純なものです。
(ラブリー VB で) そうするとしましょう:
Dim t1 As New Task(Sub() Debug.WriteLine("t1"))
Dim t2 As Task = t1.ContinueWith(Sub() Debug.WriteLine("t2"))
Dim t3 As Task = t1.ContinueWith(Sub() Debug.WriteLine("t3"))
t1.Start()
t1.ContinueWith が 2 回使用されていることに注意してください。これらのタスクの好ましい実行順序は何ですか?私にとって、それは偶然か間違っています。
なぜ?
これをやりたい理由は…
- データを取得して返すタスクを作成する
- UI を「整理」するタスクが続きます。
TaskScheduler.FromCurrentSynchronizationContext()
(UIスレッド) - 元のデータ取得タスクに従って、データを長いレポートに変換します (時間がかかります)
- UI スレッドに戻り、そのレポートをプレビュー コントロールに割り当てます。
- クリーンアップ (進行状況のアニメーションなどを削除)
ステップ 4 が次のとおりであるため、これはさらに複雑になります。 オプション.
このような状況の中で、私のタスクは、UI とタスクが適切に機能するようにメンバーのプロパティを設定するために後ろ向きに取り組んでいます。おそらく、タスクの結果を完全に無視して、メンバー変数の同期だけに固執する必要があります。結局のところ、それらはすべて 1 回しか割り当てられません。
ありがとう、トム
解決
のタスクは、より良いメモリの局所性のためのLIFOの順序で実行されています。あなたがdifferntスケジューラを使用している場合か、MSが「固定」にオリジナルのものを決定した場合、これは当然のことながら変更することができます。私はあなたがこの動作に依存すべきであるということはないと思います。代わりに、あなたはそれが完了したとき、前のタスクの作業を続けるためにあなたの仕事のラップを解除できます。そうしないと、あなたは間違ったことで待機しています。もっとに関する情報はここで見つけることができます: http://msdn.microsoft.com/en-私たち/ライブラリ/ ee795275.aspxする
他のヒント
t2 と t3 の間の順序を強制したい場合は、t1 ではなく t3 が t2 から継続するように変更してみてはいかがでしょうか。
Dim t1 As New Task(Sub() Debug.WriteLine("t1"))
Dim t2 As Task = t1.ContinueWith(Sub() Debug.WriteLine("t2"))
Dim t3 As Task = t2.ContinueWith(Sub() Debug.WriteLine("t3"))
t1.Start()
t2 と t3 の実行時間が長い場合は、記述どおりに並列実行されます。
この動作を変更するためにカスタム タスク スケジューラを作成する必要はありません。
イアン・マーサーの答えにあなたのコメントに基づいて、私は
のようなものをお勧めしますTask t1 = new Task((_)=>Console.WriteLine("t1"));
Task tn = secondTaskCondition ? t1.ContinueWith((_)=>Console.WriteLine("t2")) : t1;
Task t3 = tn.ContinueWith((_)=>Console.WriteLine("t3"));
t1.Start();
このはあなたに決定論的実行を与え、まだあなたがオプションユニットを使用してワークフローを構成することができます。