Ich bin etwas verwirrt in Bezug auf den Dispatcher. Angenommen, ich bin in einem Hintergrund-Thread und mache eine lange Operation. Ich möchte den ui-Thread updaten. Ich verstehe, dass ich dies über den Dispatcher mache. Meine Frage ist, rufe ich den Dispatcher statisch wie: Dispatcher.BeginInvoke (mywork) ... Oder auf dem Steuerelement, das ich aktualisieren möchte: mytextbox.Dispatcher.BeginInvoke (mywork)
Es ist erwähnenswert, dass das Aufrufen von Dispatcher.BeginInvoke
kein statischer Aufruf ist: es ist ein implizites this.Dispatcher.BeginInvoke
. Wenn Sie diesen Aufruf verwenden können, schreiben Sie Ihren Code wahrscheinlich bereits in einem Steuerelement oder Fenster. In diesem Fall können Sie wahrscheinlich sicher anrufen, da es in den meisten Fällen einen UI-Thread pro Anwendung gibt.
Der eigentliche statische Aufruf wäre Dispatcher.CurrentDispatcher.BeginInvoke
, was nicht etwas ist, das Sie aufrufen möchten (siehe meinen Kommentar zu Hasan Khans Antwort für warum).
BEARBEITEN: Aufruf von Application.Current.Dispatcher
ist nicht eine schlechte Sache. (Aus Gründen der Übersichtlichkeit handelt es sich um eine Instanzeigenschaft und nicht um eine statische Instanz, die für eine statische / Singleton-Instanz von Application
aufgerufen wird.) Diese Eigenschaft gibt den Dispatcher für den Thread zurück, mit dem die App erstellt wurde. Dies ist normalerweise der Thread dass die Benutzeroberfläche ebenfalls erstellt wird - so liefert Application.Current.Dispatcher
den gleichen Dispatcher wie myWindow.Dispatcher
.
Der statische Aufruf Dispatcher.CurrentDispatcher
(gegen den ich gewarnt habe) gibt einen Dispatcher für den Thread zurück, von dem Sie ihn aufgerufen haben. Wenn Sie es aus einem Hintergrundthread aufrufen, erhalten Sie einen neuen Dispatcher, der speziell für diesen Thread erstellt wurde - was oft nicht gewünscht ist.
Zuerst denke ich, es ist wichtig zu verstehen, dass die Dispatcher
ist nicht für große Hintergrundoperationen ausgelegt. Es dient dazu, die Arbeit am UI-Thread eines Objekts in die Warteschlange zu stellen. Hier ist ein lohnender MSDN-Artikel zum .NET-Threading-Modell und Dispatcher
:
Die Standardmethode zur Implementierung der Methode Dispatcher.BeginInvoke
wäre, sie aufzurufen auf dem Steuerelement:
Hoffe das hilft!
Während in meisten -Fällen entweder DispatcherObject.Dispatcher
verwendet wird (alle Abhängigkeitsobjekte und Steuerelemente erben von DispatcherObject
unter anderen) oder Application.Current.Dispatcher
ist das Richtige, da es normalerweise nur eins gibt UI-Thread, es kann mehrere UI-Threads geben und verschiedene Fenster können verschiedene Dispatcher verwenden. In diesem Fall ist es wichtig, das Steuerelement mit seinem Dispatcher zu aktualisieren. Es ist in seiner Eigenschaft Dispatcher
(geerbt von DispatcherObject
), einem anderen Steuerelement in diesem Fenster und dem Fenster selbst gespeichert.