WPF / threading: Dispatcher statisch vs. Dispatcher auf einem Steuerelement?

8

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)

    
foreyez 06.01.2011, 22:46
quelle

3 Antworten

14

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.

    
Dan Puzey 23.02.2011 13:42
quelle
0

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:

%Vor%

Hoffe das hilft!

    
Martin Buberl 23.02.2011 13:25
quelle
0

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.

    
Athari 21.03.2014 14:15
quelle

Tags und Links