Dispatcher.CurrentDispatcher vs. Application.Current.Dispatcher

Was sind die Unterschiede zwischen Dispatcher.CurrentDispatcher (in System.Windows.Threading ) und Application.Current.Dispatcher (in System.Windows )?

Mein Bauch sagt mir, dass Application.Current.Dispatcher wird nie ändern und ist global für alle Threads in der aktuellen Anwendung, während Dispatcher.CurrentDispatcher eine neue Instanz von Dispatcher abhängig von dem Thread erstellen, aus dem es aufgerufen wurde.

Ist das korrekt?

Wenn dies der Dispatcher.CurrentDispatcher ist, dient Dispatcher.CurrentDispatcher hauptsächlich der Multithread-Benutzeroberfläche?

   

Mein Bauch sagt mir, dass Application.Current.Dispatcher wird nie ändern und ist global für alle Threads in der aktuellen Anwendung, während Dispatcher.CurrentDispatcher eine neue Instanz von Dispatcher abhängig von dem Thread erstellen, aus dem es aufgerufen wurde.

Das ist richtig.

Darüber hinaus hat es keinen Sinn, auf Dispatcher.CurrentDispatcher von einem Nicht-UI-Thread aus zuzugreifen. Es wird nichts tun, wenn Sie Dispatcher.Run aufrufen, und in eine unendliche Nachrichtenschleife zu gehen, ist nicht das, was Sie von Worker-Threads aus tun möchten.

Damit:

  • Im häufigsten Szenario , in dem Ihre App nur über einen einzigen Benutzeroberflächenthread verfügt, geben Application.Current.Dispatcher und Dispatcher.CurrentDispatcher im Benutzeroberflächenthread dieselbe Instanz zurück. Welche Sie verwenden, ist einfach eine Frage der Präferenz.

  • Wenn Ihre App über mehr als einen UI-Thread verfügt, wird jedes DispatcherObject permanent mit dem Dispatcher des UI-Threads verknüpft, in dem es beim Erstellen erstellt wurde. In diesem Fall verweist Application.Current.Dispatcher auf den Dispatcher des Threads, mit dem Ihre Anwendung erstellt wurde. Sie können es nicht verwenden, um Nachrichten an Steuerelemente zu senden, die Ihren anderen UI-Threads gehören.

Einfach gesagt…

Dispatcher.CurrentDispatcher ruft den Dispatcher für den aktuellen Thread ab . Wenn Sie also den Dispatcher des UI-Threads aus einem Hintergrundprozess suchen, sollten Sie diesen nicht verwenden.

Application.Current.Dispatcher Ihnen immer den Dispatcher des UI-Threads, da dies der Thread ist, der die einzige Anwendungsinstanz aufruft.

Mein Bauch sagt mir, dass Application.Current.Dispatcher wird nie ändern und ist global für alle Threads in der aktuellen Anwendung, während Dispatcher.CurrentDispatcher eine neue Instanz von Dispatcher abhängig von dem Thread erstellen, aus dem es aufgerufen wurde.

Das ist richtig, der Application.Current.Dispatcher ist eine Instanzeigenschaft der Anwendung, die bei der Konstruktion als Dispatcher des aktuellen Threads zugewiesen wird. Und wie die Dokumentation von Dispatcher.CurrentDispatcher zeigt:

Ruft den Dispatcher für den aktuell ausgeführten Thread ab und erstellt einen neuen Dispatcher, sofern noch keiner dem Thread zugeordnet ist.


Wenn dies der Fall ist, dient Dispatcher.CurrentDispatcher hauptsächlich der Multithread-Benutzeroberfläche?

Möglicherweise habe ich keine Verwendung gefunden, um den Dispatcher eines Hintergrund-Threads zu erhalten, da Sie normalerweise keine UI-Elemente haben, an die Sie möglicherweise Operationen senden möchten.