Ereignis von Thread

05/10/2008 - 17:46 von Thomas Bock | Report spam
Hi NG

Ich habe in meiner Anwendung eine Klasse mit einem Thread. Dieser soll ein
Ereignis über den Status bzw. Fortschritt der Thread-Aktion an die Anwendung
senden. Hierzu habe ich in der Klasse mit dem Thread ein normales Ereignis
definiert, und in der Anwendung eine EReignisbehandlung eingefügt. Nun
erhalte ich die Meldung "Ungültiger threadübergreifender Vorgang. Der
Zugriff auf das Steuerelement lblStatus erfolgte von einem anderen Thread
als dem Tread, für den es erstellt wurde."

Nach der Dokumentation ist das grundsàtzlich wohl richtig, weil man bei
einem aneren Thread bei Steuerelementen mit Invoke arbeiten muß. Beim
Googeln bin ich auf folgende Lösung gestoßen:

void StatusChanged(object sender, string status)
{
StatusEventHandler handler = new
StatusEventHandler(this.InvokeStatusChanged);
this.lblStatus.Invoke(Handler, new object[]{sender, status});
}
void StatusChanged(object sender, string status)
{
this.lblStatus.Text = status;
}
StatusEventHandler ist der EventHandler in der Thread-Klasse.

Mir erscheint diese lösung erstens nicht so wirklich logisch und es
wiederstrebt mir eigentlich, für jedes Ereignis der Thread-Klasse in der
Hauptanwendung zweimal Ereignisprozeduren einzufügen.

Wie wàre der richtige Weg für Ereignisbehandlungen in der Hauptanwendung,
die Steuerelemente-betreffen?

Vielen Dank
Thomas Bock
 

Lesen sie die antworten

#1 Frank Dzaebel
05/10/2008 - 19:29 | Warnen spam
Hallo Thomas,

"Ungültiger threadübergreifender Vorgang. Der
Zugriff auf das Steuerelement lblStatus erfolgte von einem anderen Thread
als dem Tread, für den es erstellt wurde."



[Bearbeiten von Steuerelementen aus Threads]
http://dzaebel.net/ControlInvoke.htm




soll ein Ereignis über den Status bzw. Fortschritt der Thread-Aktion
an die Anwendung senden.



Beispiel:

[FTP Upload mit Byte-Anzeige]
http://dzaebel.net/FtpUpload.htm

[Ereignisbasierte asynchrone Muster]
http://dzaebel.net/AsynchronEventPattern.htm

Das Framework benutzt auch oft die Synchronized-Methoden
um threadsichere Wrapper zu bilden.





Wie wàre der richtige Weg für Ereignisbehandlungen in der
Hauptanwendung, die Steuerelemente-betreffen?



hmm, es sind ja schon eine Menge Links/Material gegeben -
wenn man die interne auch mitzàhlt. Sicher gibt das schon
die eine oder andere Anregung. Wenns nicht reicht,
noch einmal posten.


ciao Frank
Dipl.Inf. Frank Dzaebel [MCP/MVP C#]
http://Dzaebel.NET

Ähnliche fragen