Merkwürdigkeit des Threadings

24/04/2009 - 14:24 von Ahrimaan | Report spam
Hallo zusammen,

ich habe eine Backgroundworker.
Dieser ruft aus einem Workerthread eine MEthode des Hauptfensters auf.
Eine Variable im Hauptfenster zu setzten geht nur wenn ich zB ein Label was
Public ist àndern will (egal ob mit einer Methode oder direkt) sagt er mir
das ein Threadübergreifen nicht möglich ist

Bei Variablen geht das bei Labeln aber nicht ?

Grüße
Pawel
 

Lesen sie die antworten

#1 Frank Dzaebel
24/04/2009 - 15:14 | Warnen spam
Hallo Pawel,

ich habe eine Backgroundworker.
Dieser ruft aus einem Workerthread eine MEthode des Hauptfensters auf.
Eine Variable im Hauptfenster zu setzten geht nur wenn ich zB ein Label was
Public ist àndern will (egal ob mit einer Methode oder direkt) sagt er mir
das ein Threadübergreifen nicht möglich ist
Bei Variablen geht das bei Labeln aber nicht ?



~ja. Beachte ggf. noch mal den Satz aus meinem Link:

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

-> "Methoden, die sich auf Steuerelemente auswirken,
sollten nur aus dem Thread ausgeführt werden, auf
dem das Steuerelement erstellt wurde."

Dort ist von "Steuerelementen" die Rede.

Nun funktionieren gemeinsamen Objekte
(die von mehreren Threads gleichzeitig benutzt
werden können - Du nennst sie hier Variablen)
scheinbar sonst, aber die Wahrheit ist, dass sogar ein
simpler bool ggf. auf volatile attributiert werden sollte,
sprich hier immer Synchronisations-Strategien eingesetzt
werden müssen (je nach Schreib- und Lese-Funktion und
Möglichkeit der gleichzeitigen Zugriffs) :

[Gewusst wie: Erstellen und Beenden von Threads (C#-Programmierhandbuch)]
http://msdn.microsoft.com/de-de/lib...f3ay4.aspx

Hier Standard-CLR-Strategien, um den Zugriff auf Instanzmember und statische
Member zu synchronisieren:

[Datensynchronisierung für Multithreading]
http://msdn.microsoft.com/de-de/lib...hs7ft.aspx
_______________

Eigentlich solltest das ja über das Abbonnieren von
ProgressChanged des BackgroundWorkers gehen,
damit solche Threadwechsel eben nicht notwendig sind.
Wenn es in einer gekapselten Worker-"Klasse" ist,
könnte diese zum Beispiel auch den ProgressChanged
Event durchreichen, bzw. nach aussen stellen, wenn
der BackgroundWorker in der Klasse gekapselt ist.


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

Ähnliche fragen