Laden...

[gelöst] Multithreading: Zugriff auf Nicht-Control-Objekte: Invoke/BeginInvoke nötig?

Erstellt von userid12392 vor 14 Jahren Letzter Beitrag vor 14 Jahren 896 Views
U
userid12392 Themenstarter:in
36 Beiträge seit 2008
vor 14 Jahren
[gelöst] Multithreading: Zugriff auf Nicht-Control-Objekte: Invoke/BeginInvoke nötig?

Hallo cSharper,

ich habe eine GUI und zwei Backgroundworker;
und folgende Verständnisfrage:

Für die Zugriffe von den Backgroundworkern auf die Controls der GUI ist ja Invoke/BeginInvoke notwendig, da die Aufrufe der Funktionen der Controls nur von dem Thread aus erfolgen dürfen, der die Controls erstellt hat.

Aber was ist mit der Kommunikation zwischen den beiden Backroundworker ?

Ist es Nicht-Control-Objekten egal welcher Thread zugreift ?
Reicht es da zu locken oder gibt es noch etwas zu beachten ?

Gruß

Michael Schmitz

3.971 Beiträge seit 2006
vor 14 Jahren

Prinzipiell müssen mehrere Threads synchronisiert werden, sobald sie gleichzeitig auf eine Ressource lesend oder schreibend zugreifen.

Bei Controls wird über die MessageQueue via Invoke synchroniesiert (Einreihung eines Delegaten in eine Queue).

Greifst du auf gemeinsame Ressourcen, Variablen, Objekte von unterschiedlichen Threads zu (dazu zählt auch der BGW), muss mit lock (meist Standard), Mutex, WaitHandle oder einer anderen Klasse aus System.Threading auf die entsprechende Variable oder Ressource zugegriffen werden.

Allerdings ist Locking teuer, da meist nur ein Thread auf eine Ressource zugreifen darf, die anderen Threads müssen warten. Deshalb sollte der Lock-Bereich so klein wie möglich gehalten werden.

Es gibt 3 Arten von Menschen, die die bis 3 zählen können und die, die es nicht können...

U
userid12392 Themenstarter:in
36 Beiträge seit 2008
vor 14 Jahren

Hallo kleines_eichhoernchen,

danke für deine Antwort.

Gruß

Michael Schmitz

49.485 Beiträge seit 2005
vor 14 Jahren

Hallo Hotzenplotz257,

siehe auch [Artikel] Multi-Threaded Programmierung.

herbivore