85

Dispatcher.CurrentDispatcher(でSystem.Windows.Threading) とApplication.Current.Dispatcher(で)の違いは何System.Windowsですか?

私の腸は、それが呼び出された元のスレッドに応じて新しいインスタンスを作成する可能性があるApplication.Current.Dispatcher一方で、変更されることはなく、現在のアプリケーションのすべてのスレッドに対してグローバルであると教えてくれます。Dispatcher.CurrentDispatcherDispatcher

あれは正しいですか?

もしそうなら、Dispatcher.CurrentDispatcher主にマルチスレッドUIの目的ですか?

4

3 に答える 3

104

Application.Current.Dispatcher は決して変更されず、現在のアプリケーションのすべてのスレッドに対してグローバルであることがわかりますが、Dispatcher.CurrentDispatcher は、呼び出されたスレッドに応じて Dispatcher の新しいインスタンスを作成する場合があります。

それは正しいです。

Dispatcher.CurrentDispatcherまた、 UI 以外のスレッドからアクセスしても意味がありません。を呼び出さない限り何もしません。またDispatcher.Run、無限のメッセージ ループに入ることは、ワーカー スレッド内から実行したいことではありません。

そう:

  • 最も一般的なシナリオでは、アプリに 1 つの UI スレッドしかなく、UI スレッド内Application.Current.DispatcherからDispatcher.CurrentDispatcher同じインスタンスが返されます。どちらを使用するかは、単に好みの問題です。

  • アプリに複数の UI スレッドがある場合、それぞれDispatcherObjectは構築時に作成された UI スレッドのディスパッチャーに永続的に関連付けられます。この場合、Application.Current.Dispatcherアプリケーションが生成されたスレッドのディスパッチャーを参照します。これを使用して、他の UI スレッドが所有するコントロールにメッセージを投稿することはできません。

于 2012-05-04T13:02:09.727 に答える
22

簡単に言えば...

Dispatcher.CurrentDispatcher現在のスレッドのディスパッチャを取得します。そのため、バックグラウンド プロセスから UI スレッドの Dispatcher を探している場合は、これを使用しないでください。

Application.Current.Dispatcherこれは、唯一の Application インスタンスをスピンアップするスレッドであるため、常に UI スレッドのディスパッチャーを提供します。

于 2014-04-30T12:11:29.847 に答える
9

Application.Current.Dispatcher は決して変更されず、現在のアプリケーションのすべてのスレッドに対してグローバルであることがわかりますが、Dispatcher.CurrentDispatcher は、呼び出されたスレッドに応じて Dispatcher の新しいインスタンスを作成する場合があります。

その通りですApplication.Current.Dispatcher。これは、現在のスレッドのディスパッチャになるように構築時に割り当てられるアプリケーションのインスタンス プロパティです。そして、のドキュメントがDispatcher.CurrentDispatcher指摘しているように:

現在実行中のスレッドの Dispatcher を取得し、まだスレッドに関連付けられていない場合は新しい Dispatcher を作成します。


もしそうなら、Dispatcher.CurrentDispatcher の目的は主にマルチスレッド UI ですか?

おそらく、バックグラウンド スレッドのディスパッチャーを取得する際に、操作をディスパッチする UI 要素が通常は存在しないため、使用に遭遇したことはありません。

于 2012-05-04T12:50:25.267 に答える