"Keine Rückmeldung" bei eigenem Thread

PeteProgram

Mitglied
Hallo,

ich hoffe ich bin hier richtig.
Ich versuche mit Hilfe eines Threads (ThreadStart) eine Handlung im Hintergrund so lange laufen zu lassen, bis sie zu einem positiven Ergebniss führt oder zu viele durchläufe braucht.
Dabei steht aber manchmal "Keine Rückmeldung" in der Titelleiste meiner C# Applikation

Mein Code sieht ungefähr folgendermaßen aus

Code:
...
while (!dataOkay) {
   Boolean done = false;
   GetData(ref done);
   while (!done) {
      Thread.Sleep(100);
   }
   dataOkay = CheckData();
}
...

Was mache ich falsch - könnte das mit dem GarbageCollector in Zusammenhang stehen.

Die Anwendung stürzt übrigens nicht ab, sondern beendet alle Berechnungen wie erwartet. Nur die Fehlermeldung macht keinen zuverlässigen Eindruck.

Danke
 
Hallo,

"keine Rückmeldung" erscheint auch, wenn die CPU fast vollständig auslastet wird, da die App dann nicht mehr auf äußere Events reagieren kann.

Was macht dieser Part:
C#:
while (!done) {
  Thread.Sleep(100);
}
Wird die Variable "done" noch irgendwo außerhalb dieses Threads verändert? Ansonsten kommst du aus dieser Schleife nie raus. Falls du nur auf irgendwas wartest, wäre evt. die Verwendung der AutoResetEvent-Klasse zweckmäßig.

Ein "Thread.Sleep" sollte auch in der äußeren Schleife "while (!dataOkay) ... " enthalten sein, damit die CPU-Last reduziert wird.

Gruß
MCoder
 
Hallo,

danke für Deine Antwort.

In
Code:
GetData(ref done);

wird done verändert. Die Applikation hängt sich wie gesagt nicht auf, sondern es erscheint lediglich die Meldung im Fenstertitel.

ich habe für die äußere while-Schleife noch ein Thread.Sleep(200) hinzugefügt. Leider bleibt das Verhalten stochastisch....
 
Hmm, falls GetData() die einzige Stelle ist, bei der "done" verändert wird, kommst du aus der nachfolgenden Schleife nie mehr raus, wenn "done" auf "false" gesetzt wird ...

Gruß
MCoder
 
Ja da hast Du recht - ich habe das vereinfacht. Normalerweise muss da noch ein limit rein, dass da nur 15 Versuche gestartet werden. Wie gesagt die Anwendung hängt sich nicht auf - keine Endlosschleife, der Vorgang wird ordnungsgemäß durchgeführt und abgeschlossen, der nachfolgende Code wird immer durchlaufen.
 
Hallo,

eigentlich kommt "keine Rückmeldung" nur, wenn der GUI-Thread (Applikation) blockiert. Selbst wenn du in einem eigenen Thread eine hohe CPU-Last erzeugst, sollte das nichts ausmachen. Vielleicht solltest du mal etwaige Verbindungen zwischen dem GUI-Thread und dem deinem Thread überprüfen (z.B. Aktualisierung von Control-Eigenschaften).

Gruß
MCoder
 
Kann es sein, dass an jedes Fenster immer wieder so was wie ein Validate geworfen wird und sich die Anwendung deswegen beklagt?

Ansonsten ruft die Applikation interne eine statische Methode auf, die den Thread startet und dann hat das Fenster nix mehr zu tun. Dem Thread übergebe ich noch ein Delegate, damit er wenn er fertig ist was in der Hauptapplikation auslösen kann.
 
Kann es sein, dass an jedes Fenster immer wieder so was wie ein Validate geworfen wird und sich die Anwendung deswegen beklagt?
Das muss man dann schon explizit programmieren :)

An welcher Stelle startest du den Thread? Passiert das auch, wenn du mal alle Aktionen aus dem Thread rauswirfst und nur mit Sleep ein paar Sekunden wartest? Wenn ja liegt das Problem sehr wahrscheinlich außerhalb des Threads. Andernfalls musst du mal den Code im Thread durchleuchten.

Gruß
MCoder
 
Hallo,

Nein diese Probleme traten dann nicht mehr auf.

ich habe das jetzt auf andere Weise gelöst.

Im Prinzip wollte ich eine Art asynchronen Thread starten, der völlig losgelöst von der Hauptapplikation ein paar Besorgungen erledigt und der sich zum Schluss per Delegate zurückmeldet (eine MessageBox mit Meldung), meistens kam aber wie gesagt bereits vorher die Fehlermeldung vom System.

Geholfen hat nun die ganze Sache "nach Vorschrift" mit dem BackgroundWorker zu erledigen...

Danke für die Bemühungen
 
Zurück