6

私はWPFを使用していますが、実行順序Control.Dispatcher.BeginInvoke()Control.Dispatcher.Invoke().

以下にコードの例を示します

backgroundThread = new Thread(BackgroundThread);
backgroundThread.Start();
public void BackgroundThread()
{
    this.Dispatcher.BeginInvoke(new Action(delegate()
    {
      WriteLog("Run command 1");
    }));

    this.Dispatcher.Invoke(new Action(delegate()
    {
      WriteLog("Run command 2");
    }));
}

「コマンド 1」は「コマンド 2」の前に実行され、終了することを期待していますが、「コマンド 2」が「コマンド 1」の前に実行されているように見えることがあります。私はインターネットと MSDN ドキュメントについて多くのことを調査しましたが、なぜこれが起こるのかわかりません。

これらの関数のルールを正確に教えてください。

どうもありがとう!

T&T

4

4 に答える 4

6

BeginInvokeそのアクションを同期的に呼び出すwhileActionに関連付けられているスレッドで、渡された を非同期的に呼び出します。DispatcherInvoke

言い換えれば、渡されたInvokeものをすぐに実行し、渡されたアクションをキューに入れます。これは、実行しようとしているもののリストのようなものですが、それがいつ発生するか、またはすぐに発生するという保証はありませんディスパッチャーは、そのキューで待機している他の処理を完了しました。ActionBeginInvokeDispatcherDispatcher

そのDispatcherため、何か他のことをするのに忙しく、渡されたアクションをBeginInvoke実行できるようになるまでキューの最後に置き、渡されたアクションをInvokeすぐに実行することがあります。これが順序の違いの理由です。

于 2013-08-03T11:07:26.913 に答える
1

誰かこれらの関数のルールを正確に教えてください

以下、違い

Dispatcher.Invoke: Executes the specified delegate synchronously on the thread the Dispatcher is associated with
Dispatcher.BeginInvoke: Executes the specified delegate asynchronously on the thread the Dispatcher is associated with..

そして今、あなたの理解

「コマンド 1」が「コマンド 2」の前に実行されて終了することを期待していますが、「コマンド 1」の前に「コマンド 2」が実行されているように見えることがあります。

最初の呼び出しは非同期であるため、2 番目の呼び出し (同期) の前または後に終了する場合があります。

于 2013-08-03T11:10:42.617 に答える
1

「コマンド 1」は「コマンド 2」の前に実行され、終了することを期待していますが、「コマンド 1」の前に「コマンド 2」が実行されているように見えることがあります。

Control.BeginInvokeが同期的に実行されている間に非同期に実行されるため、あなたの仮定は間違っていControl.Invokeます。

コマンド 1 がコマンド 2 の前に確実に実行されるようにする場合は、 を使用してコマンド 1 を実行しInvokeます。

あなたがそれを実行しようとしているとき、それはDispatcherまでであるため、あなたが使用するときBeginInvokeは得られません。order guarantee

于 2013-08-03T11:11:04.653 に答える