Wie lese ich textbox.Text Wert von einem anderen Thread in WPF?

8

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:

  • Was ist die einfachste und lesbarste Art, den Wert eines GUI-Thread-Cross-Threads zu lesen (ich habe mehrere gefunden und sie sind zu ausführlich für etwas, das wirklich grundlegend sein sollte)?
  • Kann ich den Text nicht blockfrei lesen? In diesem Fall ist mir die Fadensicherheit egal.

- BEARBEITEN -
Ich habe den Dispatcher benutzt, aber einen ausführlicheren Anruf gehabt, dann was John hatte:

%Vor%

Würde mich aber auch nicht um etwas kümmern. Der Zugriff auf eine Texteigenschaft sollte absolut einfach sein.

    
Boris Callens 02.04.2009, 14:53
quelle

7 Antworten

5

Oisin hat recht, Sie müssen sich Dispatcher ansehen. So etwas sollte funktionieren und ist nicht zu ausführlich:

%Vor%     
John Myczek 02.04.2009 15:32
quelle
5

Sie können entweder:

  • Verwenden Sie die 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.
  • Verwenden Sie eine DispatcherTimer , um regelmäßig Nachrichten auf dem Server auszuführen UI-Thread.
  • Verwenden Sie eine Bindung 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.
Kent Boogaart 02.04.2009 15:50
quelle
1

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:

Ссылка

    
x0n 02.04.2009 15:01
quelle
1

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.

    
Wray Smallwood 03.12.2011 22:04
quelle
1

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.

    
CFD 16.01.2014 21:00
quelle
1

Ich verwende die folgende Erweiterungsmethode, um dies zu umgehen:

%Vor%

Und natürlich muss diese Methode in einer eigenen statischen Klasse hinzugefügt werden.

    
Amit Dash 07.08.2014 09:20
quelle
0

Meine Lösung ... Der XAML:

%Vor%

und die cs-Datei:

%Vor%

Das zweite Textfeld ist für einen Typprüfung während der Thread läuft

    
a52 27.09.2010 14:56
quelle

Tags und Links