In meinem WPF-Formular habe ich ein Textfeld.
Wenn ein Timer abgelaufen ist, muss der Inhalt der Textbox abgerufen werden.
Der abgelaufene Timer arbeitet in einem anderen Thread als der Benutzeroberfläche.
Die Frage ist irgendwie zweifach:
- BEARBEITEN -
Ich habe den Dispatcher benutzt, aber einen ausführlicheren Anruf gehabt, dann was John hatte:
Würde mich aber auch nicht um etwas kümmern. Der Zugriff auf eine Texteigenschaft sollte absolut einfach sein.
Oisin hat recht, Sie müssen sich Dispatcher ansehen. So etwas sollte funktionieren und ist nicht zu ausführlich:
%Vor%Sie können entweder:
Dispatcher
, um eine auszuführende Nachricht zu planen auf dem UI-Thread von einem Hintergrund-Thread. Ein DispatcherPriority
von Send
liefert Ihnen die schnellste Antwort möglich. DispatcherTimer
, um regelmäßig Nachrichten auf dem Server auszuführen UI-Thread. OneWayToSource
, um die Eigenschaft Text
mit einer Eigenschaft Ihrer Hintergrundkomponente zu verbinden. Auf diese Weise müssen Sie keine Arbeiten ausführen, um den Wert der Eigenschaft zu erhalten - sie wurde bereits an Ihre Komponente geliefert. Es gibt keinen "schnellen Hack" zum Lesen der Werte eines GUI-Objekts von einem anderen Thread als dem, der es erstellt hat. WPF erlaubt dir einfach nicht, alles zu tun. Windows Forms würde sich gelegentlich beschweren, aber WPF ist viel strenger.
Sie müssen etwas über den Dispatcher erfahren. Es mag vielleicht etwas ausschweifend aussehen, aber es ist wirklich nicht so schwer zu verstehen. Sie übergeben einen Delegaten an den Dispatcher, der auf eine Methode verweist, die Sie im GUI-Thread aufrufen möchten, und zwar.
Hier ist ein schönes einfaches Beispiel:
Eine weitere Antwort ist Jeff Wilcox SmartDispatcher-Klasse.
Irgendwo im Konstruktor- oder Load-Ereignis wird ein SmartDispatcher.Initialize () ausgeführt (um den UI-Dispatcher zu setzen)
Dann müssen Sie irgendwo eine Eigenschaft festlegen oder eine Methode aufrufen:
%Vor%Das Schöne daran ist, dass Sie nicht wissen müssen, ob es auf dem UI-Thread ist oder nicht (und Sie müssen es möglicherweise von beiden tun). Der SmartDispatcher kümmert sich bei Bedarf um den Thread-Wechsel.
Das Obige ist asynchron, aber wenn Sie es synchron benötigen, fügen Sie einfach eine andere Methode hinzu, um Invoke anstelle von BeginInvoke aufzurufen.
Zufälligerweise stolperst du hier rein. Vor einiger Zeit habe ich gerade damit begonnen, eine statische Klasse aufzubauen, die ich meinen Projekten hinzufügen kann, um schnell auf einige gängige Steuerungseigenschaften zugreifen zu können. Es ist im Laufe der Zeit aufgebläht, macht aber die Dinge ziemlich einfach, während es eine Menge Dispatcher-Code versteckt. Roh, aber effektiv. Könnte dir ein paar Ideen geben. Ich kann grundsätzlich so etwas machen:
%Vor%So sieht der SafeGuiWpf zuletzt aus, wenn Sie ihn hilfreich finden. (Denken Sie, es funktioniert in NET 3 und höher, aber es ist eine Weile her)
%Vor%Im Nachhinein hätte es sie vielleicht noch glatter gemacht, wenn ich das als Klassenerweiterungen gemacht hätte.
Tags und Links wpf .net multithreading