4

これが単純な質問である場合は、ご容赦ください。答えを探すのに十分な一般的な言い方をすることができませんでした。

このコードを考えてみましょう:

var task = Task.Factory.StartNew(() => Whatever());  
task.ContinueWith(Callback, TaskScheduler.FromCurrentSynchronizationContext())

コールバックメソッドがいつ実行されるかはどの程度正確に決定されますか?

メインスレッドが現在実行していることをすべて終了するまで待機しますか、それとも非同期呼び出しが完了した直後に呼び出されますか?そして、このコールバックは、メインスレッドが以前の状態に戻る前に完全に実行されますか?

4

1 に答える 1

8

メインスレッドが現在実行していることをすべて終了するまで待機しますか、それとも非同期呼び出しが完了した直後に呼び出されますか?

非同期呼び出しが完了すると、継続がスケジュールされます。そのスケジューリングの効果は(もちろん)スケジューラーによって異なりますが、「通常の」WPFまたはWindowsフォームメッセージループの場合、Control.BeginInvokeまたはの呼び出しと同様の方法でスケジュールされると予想されますDispatcher.BeginInvoke。 「メイン」スレッドは、このタスクの前にスケジュールされていた残りのタスクを終了しました。

メインスレッドが魔法のように実行を停止して継続を実行することは期待していません。ただし、キュー内で継続を優先度の高いタスクにする可能性があります。

于 2012-07-09T14:34:35.800 に答える