Sicherstellen, dass die Dinge auf dem UI-Thread in WPF ausgeführt werden

Ich erstelle eine WPF-Anwendung. Ich führe eine asynchrone Kommunikation mit dem Server durch und verwende die Ereignisaggregation mit Prism auf dem Client. Beides führt dazu, dass neue Threads erzeugt werden, bei denen es sich nicht um den UI-Thread handelt. Wenn ich versuche, "WPF-Vorgänge" für diese Callback- und Event-Handler-Threads auszuführen, zerfällt die Welt, was nun begonnen hat.

Zuerst habe ich Probleme beim Versuch, einige WPF-Objekte im Callback vom Server zu erstellen. Mir wurde gesagt, dass der Thread im STA-Modus ausgeführt werden muss. Jetzt versuche ich, einige UI-Daten in einem Prism-Ereignishandler zu aktualisieren, und Folgendes wird mir mitgeteilt:

Der Aufrufer kann nicht auf diesen Thread zugreifen, da er einem anderen Thread gehört.

Damit;Was ist der Schlüssel, um die Dinge in WPF richtig zu machen? Ich habe im WPF-Dispatcher nachgelesendieser MSDN Beitrag. Ich fange an, es zu verstehen, aber ich bin noch kein Zauberer.

Ist der Schlüssel, um immer Dispatcher.Invoke zu verwenden, wenn ich etwas ausführen muss, von dem ich nicht sicher bin, ob es im UI-Thread aufgerufen wird?Ist es wichtig, ob es tatsächlich auf dem UI-Thread aufgerufen wurde und ich Dispatcher.Invoke trotzdem?Dispatcher.Invoke = synchron. Dispathcher.BeginInvoke = async?Fordert Dispatcher.Invoke den UI-Thread an und wartet dann nicht mehr darauf? Ist es eine schlechte Praxis und das Risiko weniger ansprechender Programme?Wie komme ich überhaupt zum Disponenten? Gibt mir Dispatcher.CurrentDispatcher immer den Dispatcher, der den UI-Thread darstellt?Wird es mehr als einen Dispatcher geben oder stimmt "Dispatcher" im Grunde mit dem UI-Thread für die Anwendung überein?Und wie sieht es mit dem BackgroundWorker aus? Wann verwende ich das stattdessen? Ich nehme an, das ist immer asynchron?Wird alles, was auf dem UI-Thread ausgeführt wird (durch Aufrufen), im STA-Apartment-Modus ausgeführt? Das heißt Wenn ich etwas habe, das im STA-Modus ausgeführt werden muss, reicht Dispatcher.Invoke aus?

Möchte jemand Dinge für mich klären? Irgendwelche verwandten Empfehlungen usw? Vielen Dank!

Antworten auf die Frage(1)

Ihre Antwort auf die Frage