14

質問

これはおそらく私が見逃した単純なものです。

私がそうしているとしましょう(loveley 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 回使用されていることに注意してください。これらのタスクの優先実行順序は? 私にとって、それはランダムか間違っています。

なんで?

やりたい理由は…

  1. データを取得して返すタスクを作成する
  2. 続いて、UI を「整理」するタスクTaskScheduler.FromCurrentSynchronizationContext()(UI スレッド)
  3. データを長いレポートに変換して、元のデータ取得タスクに従います (時間がかかります)。
  4. UI スレッドに戻り、そのレポートをプレビュー コントロールに割り当てます。
  5. クリーンアップ (進捗アニメーションなどを取り除く)

これは、ステップ 4 がオプションであるため、さらに複雑になります。

これらすべての最中に、UI とタスクが適切に機能するように、私のタスクは逆方向に曲がってメンバー プロパティを設定しています。おそらく、タスクの結果を完全に捨てて、メンバー変数の同期に固執する必要があります。結局、それらはすべて一度だけ割り当てられます。

ありがとう、トム

4

3 に答える 3

12

タスクは、メモリの局所性を高めるために LIFO 順序で実行されます。もちろん、別のスケジューラを使用する場合、またはMSが元のスケジューラを「修正」することを決定した場合、これは変更できます。この振る舞いに頼るべきではないと思います。代わりに、タスクをアンラップして、前のタスクが完了したときに作業を続けることができます。そうでなければ、あなたは間違ったことを待っています。詳細については、http: //msdn.microsoft.com/en-us/library/ee795275.aspxを参照してください。

于 2010-11-19T16:41:56.647 に答える
5

t2 と t3 の間の順序を強制したい場合は、t1 ではなく t2 から t3 が続くように変更してみませんか?

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 が長時間実行されていた場合、記述したように並行して実行されます。

この動作を変更するためにカスタム タスク スケジューラを作成する必要はありません。

于 2010-11-25T01:36:09.107 に答える