5

UI スレッドの Dispatcher など、Dispatcher に対していくつかのメソッドを呼び出すと、

ここみたいに

uiDispatcher.BeginInvoke(new Action(insert_), DispatcherPriority.Normal);
uiDispatcher.BeginInvoke(new Action(add_), DispatcherPriority.Normal);
uiDispatcher.BeginInvoke(new Action(insert_), DispatcherPriority.Normal);

これらのメソッドは、私が呼び出したのと同じ順序で実行されますか?

4

2 に答える 2

11

を使用するDispatcherと、これらは常に呼び出されたのと同じ順序で実行されますが、これは が同じであるためDispatcherPriorityです。これは保証された動作であり、Dispatcher.BeginInvokeに記載されています。

複数の BeginInvoke 呼び出しが同じ DispatcherPriority で行われた場合、それらは呼び出しが行われた順序で実行されます。

そうは言っても、非同期操作では、通常、この動作に依存しない方がよいでしょう。非同期操作として呼び出す場合は、特定の順序で実行することを計画しないでください。これは事実上、非同期操作とスケジューラー実装の間のカップリングを作成しています。

順序が問題になる場合は、通常、スケジューリング メカニズムが変更されたとしても、これが保証されるように設計をやり直すことをお勧めします。たとえば、TPL を使用すると、操作をスケジュールし、後続の操作を最初のタスクの継続としてスケジュールできるため、これははるかに簡単です。

于 2012-06-08T17:13:50.720 に答える
5

MSDNから

複数の BeginInvoke 呼び出しが同じ DispatcherPriority で行われた場合、それらは呼び出しが行われた順序で実行されます。

于 2012-06-08T17:14:43.913 に答える