Dispatcher to Thread-Beziehungen in WPF
Es ist mir nicht ganz klar, wie viele Disponenten gibt es in einer Anwendung und wie Sie verbunden sind, oder über einen Verweis von Threads.
Wie ich es verstehe, eine WPF-Anwendung hat 2 threads (einer für die Eingabe, das andere für das UI) und 1 Disponent (in Verbindung mit der UI-Thread). Was ist, wenn ich einem anderen thread - wir nennen Sie "worker-Threads" - wenn ich rufe Dispatcher.CurrentDispatcher
auf der worker-thread, der dispatcher würde ich bekommen?
Einem anderen Fall:
Übernehmen Sie eine Konsole-Anwendung mit 2 threads - der Haupt-thread, und ein Eingabe-thread. Auf dem Haupt-thread, den ich erstellen Sie zuerst den Eingangs-thread und dann rufe ich Application.Run()
Thread thread = new Thread(new ThreadStart(UserInputThreadFunction));
thread.Start();
Application.Run();
Gibt es ein dispatcher, richtig? Auf der Eingangs-thread, tut Dispatcher.CurrentDispatcher Rückkehr der dispatcher der Haupt-thread? Oder was ist der richtige Weg, um eine Instanz der main-thread-dispatcher?
Könnte es sein, dass es mehr als einen dispatcher in eine WPF-Anwendung? Ist es jedem Fall, würde es Sinn machen, erstellen Sie einen anderen dispatcher?
InformationsquelleAutor der Frage j00hi | 2011-02-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Diese Aussage ist so nicht ganz richtig. Eine WPF-Anwendung hat nur einen UI-thread, der behandelt alle UI-Interaktion und Benutzereingaben. Es gibt auch einen "hidden" - thread verantwortlich für die Darstellung, aber normalerweise ist das die Entwickler nicht mit ihm umgehen.
Dispatcher /Thread-Beziehung eins-zu-eins, d.h. ein Dispatcher ist immer assoticated mit einem thread und kann verwendet werden, um die dispatch-Ausführung zu diesem thread.
Dispatcher.CurrentDispatcher
gibt der dispatcher für den aktuellen thread, das ist, wenn Sie anrufenDispatcher.CurrentDispatcher
auf einem "worker thread" erhalten Sie einen dispatcher für diesen thread arbeiten.Disponenten erstellt werden, auf die Nachfrage, was bedeutet, wenn Sie Zugang
Dispatcher.CurrentDispatcher
und es ist kein dispatcher dem aktuellen thread zugeordnet ist, wird einer erstellt.Dass gesagt wird, die Anzahl der Disponenten in der Anwendung ist immer kleiner oder gleich der Anzahl der threads in der Anwendung.
InformationsquelleAutor der Antwort Pavlo Glazkov
WPF-Anwendung standardmäßig hat nur einen Dispatcher. Der dispatcher ist der einzige thread, ermöglichen Ihnen die Interaktion mit UI-Elementen. Es abstracts Implementierungen von Ihnen, Sie müssen nur sorgen machen, dass auf dem UI-thread dh der Dispatcher.
Wenn Sie versuchen, um die direkte Interaktion mit einem visuellen (z.B. setzen Sie einen text auf einem Textfeld mit
txtBkx.Text = "new"
), die von einem "worker thread", dann werden Sie wechseln müssen, um einen UI-thread:Alternativ können Sie
SynchronizationContext.Current
(während auf einem UI-thread) und verwenden, die zum ausführen von Delegierten auf einen UI-thread aus einem anderen thread. Sie sollten beachten, dassDispatcher.CurrentDispatcher
kann nicht immer gesetzt werden.Nun können Sie in der Tat erstellen Sie verschiedene WPF-Fenstern in der gleichen Anwendung und haben einen eigenen dispatcher für jedes Fenster:
Als seitliche Anmerkung denken Sie daran, in MVVM, können Sie update-Modell aus einem nicht UI-thread und anheben Eigenschaft verändert Ereignisse, die von einem nicht-UI-thread auf, da WPF Marschall PropertyChanged-Ereignis für Sie. Die Anhebung CollectionChanged auf einen UI-thread, obwohl.
InformationsquelleAutor der Antwort
Einen dispatcher ist immer im Zusammenhang mit einem thread und ein thread kann höchstens ein dispatcher zur gleichen Zeit ausgeführt. Ein thread nicht brauchen, um einen dispatcher.
Standardmäßig gibt es nur einen Dispatcher Für die Benutzeroberfläche. Manchmal macht es Sinn, einen anderen Disponenten, das andere mal nicht. Eine dispatching-thread muss block in der
Dispatcher.Run()
Methode, um zu verarbeiten, ruft der dispatcher. Ein Faden, wie Sie Ihre Konsole Eingangs-thread nicht availible zu verarbeiten, ruft Sie.InformationsquelleAutor der Antwort vidstige