WPF verwendet die , um den Zugriff auf die Nachrichtenpumpe zu steuern, anstatt jedes Steuerelement für den Zugriff auf den UI-Thread verantwortlich zu machen.
Sie sollten Dispatcher.Invoke
verwenden, um dem UI-Thread in einer WPF-Anwendung einen Delegaten hinzuzufügen.
Es ist auch erwähnenswert, dass InvokeRequired
nicht wirklich in einer Winform-App benötigt wird, noch ist es etwas, was Sie in einer WPF-Anwendung suchen sollten. Sie sollten wissen, dass Sie nicht im UIhread sind, wenn Sie Invoke
aufrufen. Sie sollten niemals in einer Situation sein, in der eine bestimmte Methode manchmal vom UI-Thread aufgerufen wird und manchmal von einem Hintergrund-Thread aufgerufen wird. Wähle ein; Erzwingen Sie entweder immer, dass der Aufrufer vor dem Aufruf einer bestimmten Methode den UI-Thread aufruft (Sie müssen also nicht aufrufen), oder Sie nehmen an, dass der Aufrufer beim Aufruf der Methode nicht im UI-Thread enthalten ist. Es ist auch erwähnenswert, dass das Aufrufen von Invoke
, wenn Sie bereits im UI-Thread sind, in Ordnung ist. Es gibt keine Fehler oder Probleme, die aus einer gelegentlichen Instanz des erneuten Aufrufs des UI-Threads resultieren (es fallen nur geringe Performance-Kosten an, also fügen Sie einfach keinen unnötigen Code dafür überall hinzu).
Natürlich gibt es viele Situationen, wenn du nicht weißt, ob du auf dem Erstellungs-Thread stehst oder nicht und es überprüfen musst! – Christoph
Haben Sie jemals eine Benutzerkontrolle gemacht, die es ermöglicht, Daten zu binden? Daten werden normalerweise von einem anderen Thread abgerufen, aber z. das Setzen des Wertes eines Textfelds kann auch durch ein anderes Steuerelement erfolgen (z. B. Ändern der Dropdown-Ergebnisse in einen anderen Standardwert => Sie befinden sich im UI-Thread. Zuweisen eines Wertes aus der Datenbank => Sie befinden sich in einem Worker-Thread) – Christoph
Von Weise, verwenden Sie nicht Invoke(), verwenden Sie stattdessen BeginInvoke() (sowohl in WinForms und WPF). Der Grund ist, dass Invoke() zu hässlichen Deadlocks führen kann. – Christoph