1. ホーム
  2. .net

[解決済み] Dispatcher.CurrentDispatcher vs. Application.Current.Dispatcher

2023-06-26 12:24:41

質問

の違いは何ですか? Dispatcher.CurrentDispatcherSystem.Windows.Threading ) と Application.Current.DispatcherSystem.Windows )?

私の直感では Application.Current.Dispatcher は決して変更されず、現在のアプリケーションのすべてのスレッドに対してグローバルであるのに対して Dispatcher.CurrentDispatcher の新しいインスタンスが作成されるかもしれません。 Dispatcher のインスタンスを生成するかもしれません。

というのは正しいでしょうか?

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

どのように解決するのですか?

私の直感では、Application.Current.Dispatcher は決して変更されることはなく、現在のアプリケーションのすべてのスレッドに対してグローバルです。 で、現在のアプリケーションのすべてのスレッドに対してグローバルである一方 Dispatcher.CurrentDispatcherは、呼び出されたスレッドに応じて、新しいDispatcherのインスタンスを作成することができます。 の新しいインスタンスを作成するかもしれません。

その通りです。

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

というわけで。

  • 最も一般的なシナリオでは アプリが単一の UI スレッドしか持っていない場合。 Application.Current.DispatcherDispatcher.CurrentDispatcher は同じインスタンスを返します。どちらを使うかは、単に好みの問題です。

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