Laden...

WPF - nach Event STA Thread benötigt

Erstellt von Jochen1980 vor 9 Jahren Letzter Beitrag vor 9 Jahren 3.763 Views
J
Jochen1980 Themenstarter:in
111 Beiträge seit 2006
vor 9 Jahren
WPF - nach Event STA Thread benötigt

Hallo liebes Forum,

ich hoffe jemand kann mir bei folgendem Problem helfen. Ich habe bereits im Forum gesucht und auch die FAQ ([FAQ] Controls von Thread aktualisieren lassen (Control.Invoke/Dispatcher.Invoke)) konnte mir nicht weiter helfen.

Ich habe einen WPF GUI. Dieser greift auf eine DLL zu, die aus einer Beckhoff PLC Liest und schreibt.
Wenn mein GUI schreibt, wird der entsprechende Wert auch richtig in die PLC geschrieben. Als Reaktion auf das Schreiben, verändert die PLC einen anderen Wert. Die DLL überprüft dies und löst ein Event aus, das der GUI aboniert hat. So weit so gut.
Wird nun dieses Event von der DLL gefeuert, so soll im GUI ein Control verändert werden. Im Detail: Ich erstelle ein UserControl und füge es der MainPage meiner WPF GUI an.
Und genau hier habe ich ein Problem. Eine Exception wird geworfen:

Fehlermeldung:
"Beim aufrufenden Thread muss es sich um einen STA-Thread handeln, da dies für viele Komponenten der Benutzeroberfläche erforderlich ist."

Das kann ich nicht wirklich nachvollziehen, da ich ja extra die Trennung mittels der Events vorgenommen habe? Jemand eine Idee woran das liegen könnte?

Noch eine Info: Verwendet man diese DLL mit einem Windows Forms GUI, so kann man den Fehler mittels "CheckForIllegalCrossThreadCalls = false;" unterdrücken und der GUI verhält sich wie gewünscht. Entfernt man " CheckForIllegalCrossThreadCalls = false;" so crascht auch die Forms Anwendung mit der Meldung:"Ungültiger threadübergreifender Vorgang."

Nachtrag: Wenn die Lösung ein Dispatcher sein sollte, dann verstehe ich allerdings nicht, wie ich einen Dispatcher gemeinsam mit einem Event verwenden kann? Alle Beispiele verwenden den Dispatcher immer nur mit einer Methode die einmalig ausgeführt wird - ich müsste ja das Abonieren des Events per Dispatcher ausführen, oder?

5.658 Beiträge seit 2006
vor 9 Jahren

Hi Jochen1980,

Wird nun dieses Event von der DLL gefeuert, so soll im GUI ein Control verändert werden. Im Detail: Ich erstelle ein UserControl und füge es der MainPage meiner WPF GUI an.

Dann sollte es mit Dispatcher.Invoke funktionieren. Besser wäre aber, du verwendest MVVM und DataBinding. Dann brauchst du dich weder um das Invoken zu kümmern, noch manuell Steuerelemente hinzufügen.

Christian

Weeks of programming can save you hours of planning