0

WPF アプリケーションで、メソッドを直接呼び出すのと、メソッドを に渡すのとでは、何が違いDispatcher.Invoke()ますか? 私がこれまでに読んだことによると、両方とも同じ UI スレッドで実行されますね。

サンプルコード

ケース 1:

public sealed partial class Window
{ 
    private void SomeEventHandler(object sender, EventArgs e) 
    {
        SomeMethod();
    }
}

ケース 2:

public sealed partial class Window
{ 
    private void SomeEventHandler(object sender, EventArgs e) 
    {
        Dispatcher.Invoke(SomeMethod, DispatcherPriority.Send);
    }
}
4

2 に答える 2

6

この質問は、コードが UI スレッドで実行される場合にのみ意味があります。ワーカー スレッドから呼び出す場合、明らかに大きな違いがあります。Invoke() ではなく、Dispatcher.BeginInvoke を使用します。それでは、「役に立つかもしれない」という角度から考えてみましょう。

はい、デリゲート ターゲットはどちらの場合も UI スレッドで実行されます。違いは、それが実行されるときです。Dispatcher.BeginInvoke() を使用すると、プログラムが再びアイドル状態になり、ディスパッチャー ループに再び入るまで実行されません。通常、現在のメソッドが戻った後は、それがどのようにアクティブ化されたかによって異なります。

無意味に聞こえるかもしれませんが、場合によっては便利です。イベントによってメソッドがアクティブ化され、イベント ハンドラーで何かを行うと、再入の問題があるため危険な場合に役立ちます。古典的な危険は、イベントが再び発生することです。あなたのコードは、この Web サイトの名前で爆発します。または、イベントが発生した後にコードが実行されると、イベント ハンドラーで行ったことを元に戻します。Dispatcher.BeginInvoke() を使用すると、イベント ハンドラー コードの実行を遅らせることができます。それ以外の場合、これは C# 5 で async/await が機能する方法をモデル化します。

于 2013-06-05T10:13:44.213 に答える
1

TextBox.Text の更新など、UI スレッドでアクションを実行する必要があるときはいつでも、バックグラウンド スレッドから UI スレッド ディスパッチャーを使用できます。

さらに 、別のDispatcherPriorityDispatcher maintains a prioritized queue of work itemsでアクションを実行できます 。たとえば、アクションを 優先度で実行したい場合は、他のすべての非アイドル操作が完了した後に操作が処理されることを意味します。Background

于 2013-06-05T10:07:32.400 に答える