Laden...

Im Thread geänderte Variable weiterverarbeiten: Wie über die Änderung informieren?

Erstellt von SlyFox vor 9 Jahren Letzter Beitrag vor 9 Jahren 1.512 Views
S
SlyFox Themenstarter:in
231 Beiträge seit 2007
vor 9 Jahren
Im Thread geänderte Variable weiterverarbeiten: Wie über die Änderung informieren?

Hallo,

ich möchte innerhalb eines Threads eine Variable verändern und anschließend außerhalb des Threads weiter verarbeiten.

Wie bekomme ich mit, dass die Variable geändert wurde? Löse ich dazu im Thread ein Event aus oder gibt es eine bessere Lösung?

ursprünglich wollte ich das ganze mit

new Thread(new ThreadStart(delegate{...}));

lösen, aber das scheint nicht zu funktionieren.

Jetzt erstelle ich eine Instanz von Thread und rufe dann Start() und Join() auf. Aber irgendwie kommt mir das nicht richtig vor.

Thread thread = new Thread(new ThreadStart(delegate{...}));
thread.Start();
thread.Join(); // Warten auf Beenden des Threads

Vielen Dank für euren Denkanstoß

Christoph

Hinweis von Coffeebean vor 9 Jahren

Ich habe die Beiträge mal gemerged. Bitte antworte nicht selber auf deine Beiträge, wenn noch keine andere Antwort da ist. Somit bleibt der Beitrag als "Ohne Antwort" markiert. Somit deinen Beitrag lieber editieren, wenn du einen Nachtrag hast.

49.485 Beiträge seit 2005
vor 9 Jahren

Hallo SlyFox,

Thread.Start mit gleich darauf folgendem Thread.Join ist fast immer unsinnig.

Ein Event zu verwenden, ist der übliche Weg bei Threads.

Oder BackgroundWorker + RunWorkerCompleted.

Oder Task + await bzw. selbstdefinierter Continuation.

EDIT wegen des Einwands von Sebastian.Lange weiter unten: Zur Klarstellung: Ich sprach und spreche hier nicht über statische Events. Anderseits sah und sehe ich es als unproblematisch an, ein Event "statisch" zu abonnieren, also im Code einen bestimmten festen EventHandler anzugeben (als Literal). Dies ist sogar der Normalfall. Das Abonnieren eines EventHandlers erfolgt typischerweise - und das ist der wesentliche Punkt - durch den Aufrufer/Verwender. Wenn der Aufrufer einen bestimmten festen EventHandler verwenden will, spricht nicht dagegen. Wenn er später einen anderen EventHandler verwenden will oder wenn später ein anderer Aufrufer/Verwender dazu kommt, der einen anderen EventHandler verwenden will, ist das ohne Änderung des Code des Threads möglich. Es besteht also keine Notwendigkeit, den EventHandler als Argument an den Thread zu übergeben. Man hat trotzdem die volle Flexibilität.

herbivore

Gelöschter Account
vor 9 Jahren

Das scheint nicht zu funktionieren

Das ist eine sehr dürftige Fehlerbeschreibung. Ohne Exception Details wirst du auch nur allgmeine Antworten bekommen wie von herbivore.

Also gib dir bitte etwas mehr Mühe und du bekommst auch mehr Hilfe. (E/A Prinzip)
Das Problem ist definitiv lösbar,(wir haben hier schon unzählige Thread Probleme gelöst) also erklär das genau und das Problem ist bestimmt schnell gelöst.

S
SlyFox Themenstarter:in
231 Beiträge seit 2007
vor 9 Jahren

Hallo,

@herbivore: Dann versuche ich das mittels Event, danke.

@Sebastian: Es gibt gar keine Fehlermeldung. Es ging mir nur um eine Bestätigung oder Widerlegung meiner Theorie, dass mein oberer Quellcode so nicht funktioniert.

Viele Grüße

Christoph

Gelöschter Account
vor 9 Jahren

Ich habe angemommen dieses Event delegate übergibst du doch beim ersten Parameter der Methode(diesen parameter hast du leider in Pünktchen unkenntlich gemacht). Events statisch zu abbonieren ist für aynchrone Big Jobs selten bis garnicht eine gute Idee. Das wiederspricht allen existierenden Design Regeln. Insofern möchte ich dir auf den Weg geben Herbi's Ratschlag zu folgen, aber das Event nicht wie im Beispielcode von Herbi statisch abbonieren sondern den Method Pointer für dieses Event via Argument zu übergeben.

S
SlyFox Themenstarter:in
231 Beiträge seit 2007
vor 9 Jahren

Hallo,

ich glaube, das wird mir jetzt zu kompliziert.

Hier der Code, der im Thread ausgeführt wird:

                cpuCounter.NextValue();
                Thread.Sleep(1000);
                load = cpuCounter.NextValue();

cpuCounter ist ein System.Diagnostics.PerformanceCounter und gibt mir die CPU-Auslastung zurück.

load ist eine Variable vom Typ float.

Schöne Grüße

Christoph

16.835 Beiträge seit 2008
vor 9 Jahren

Besser wäre hier definitiv ein Timer.

S
SlyFox Themenstarter:in
231 Beiträge seit 2007
vor 9 Jahren

Hallo,

bist du sicher?

  • cpuCounter.NextValue() ausführen
  • Timer aktivieren (1000 ms)
  • im Timer wieder cpuCounter.NextValue() ausführen
  • Timer deaktivieren

Meinst du das so?

Viele Grüße

Christoph

//Edit: Tippfehler

16.835 Beiträge seit 2008
vor 9 Jahren

Ja und korrekt, wobei man den Timer nur ein mal startet und stoppt.

S
SlyFox Themenstarter:in
231 Beiträge seit 2007
vor 9 Jahren

Hallo,

ich dachte, dass der Timer für so was oversized wäre. Eigentlich benutzt man ihn doch für regelmäßig wiederkehrende Aktionen.

Ok, dann benutze ich einen Timer.

Viele Grüße

Christoph

16.835 Beiträge seit 2008
vor 9 Jahren

Wenn Du von Oversized redest, dann trifft das definitiv auf den Thread zu.