Laden...

Thread wird einfach abgebrochen?

Erstellt von Lotus vor 12 Jahren Letzter Beitrag vor 12 Jahren 5.867 Views
L
Lotus Themenstarter:in
73 Beiträge seit 2011
vor 12 Jahren
Thread wird einfach abgebrochen?

Hallo, ich muss mit einem Workthread arbeiten, weil die Logik "relativ" lange braucht um ihre Aktionen zu berechnen, sonst friert ja das Gui ein.

Allerdings kommt jetzt auf einmal immer folgender Fehler:> Fehlermeldung:

Eine Ausnahme (erste Chance) des Typs "System.Threading.ThreadAbortException" ist in mscorlib.dll aufgetreten.
In System.Threading.ThreadAbortException ist eine Ausnahme vom Typ "mscorlib.dll" aufgetreten, doch wurde diese im Benutzercode nicht verarbeitet.
Der Thread '<Kein Name>' (0x924) hat mit Code 0 (0x0) geendet.

Ich hab aber gar nichts an meinen Threads verändert und die haben früher auch funktioniert... (zumindestens sah es für mich so aus...)

Den Thread erzeuge ich in meiner Gui so:


private System.Threading.Thread workThread;
workThread = new System.Threading.Thread(table.gameRound);
workThread.Start();

Mein Problem ist jetzt gerade, dass ich nicht weiß wie ich den Fehler finden soll, denn er kommt nur manchmal!!! Manchmal laeuft alles wie es soll und manchmal macht er was falsch.. 😕

Weiteres Problem ist bei mir, um irgendwas im GUI anzuzeigen muss ich mit recht vielen Events arbeiten, das Problem ist aber, das der Code ja nicht auf meine Events wartet... gibts ne Möglichkeit IM Workthread zu sagen "wait()" oder im Guithread vllt? Und dann auch wieder ne Funktion "start();"? Mir nützt aber kein wait mit ner festen Zeitangabe 😕 Weil ich die Zeit ja nicht weiß wie lange der Rechner brauch um etwas auszuführen.. ach man alles so kompliziert..

3.430 Beiträge seit 2007
vor 12 Jahren

Hallo Lotus,

wieso genau dein Thread sich da beendet kann ich dir auch nicht sagen.
Aber auf Events warten mit Wait oder was auch immer brauchst du nicht.

Du kannst dem GUI-Thread über Invoke mitteilen wenn er für den Worker Thread was machen soll.

Wie das im Detail funktioniert siehst du hier: [FAQ] Warum blockiert mein GUI?
und hier: [FAQ] Controls von Thread aktualisieren lassen (Control.Invoke/Dispatcher.Invoke)

Gruß
Michael

L
Lotus Themenstarter:in
73 Beiträge seit 2011
vor 12 Jahren

Hallo, das mache ich ja, aber gleichzeitig läuft der Workthread weiter und ich glaube das verursacht in manchen Fällen Probleme...

3.430 Beiträge seit 2007
vor 12 Jahren

Hallo,

wenn du Invoke verwendest dann wartet der Worker-Thread bis der GUI-Thread die aufgabe fertig hat.
Mit BeginInvoke wartet der Worker-Thread nicht bis der GUI-Thread fertig hat

Aber ohne weitere Informationen kann man hier so gut wie gar nix dazu sagen.

Debugge einfach mal durch den Code oder baue ein paar Ausgaben ein, damit du feststellst wo das Problem auftretet..

Gruß
Michael

L
Lotus Themenstarter:in
73 Beiträge seit 2011
vor 12 Jahren

Ich rufe das Invoke so auf:

        private void activePlayer()
        {
if (Dispatcher.CheckAccess())
            {
               //do something
            }

            else
            {
                Dispatcher.Invoke(new voidAsyncDelegate(activePlayer), null);
            }
}

Ich hasse Fehler die sich nicht reproduzieren lassen 😕

6.911 Beiträge seit 2009
vor 12 Jahren

Hallo Lotus,

bau in der asynchronen Methode ein try-catch ein und setzt im cath-Teil einene Haltepunkt oder schreib die Fehlermeldung mittels Tracing raus (zB Trace.WriteLine). So kannst du wenigsten die Ursache aufspüren. Siehe auch [Tutorial] Vertrackte Fehler durch Vergleich von echtem Projekt mit minimalem Testprojekt finden

das der Code ja nicht auf meine Events wartet

wenn gewartet würde wäre ja das ganze asynchrone Arbeiten umsonst. Die Events werden ausgelöst sobald die Arbeit fertig und dann entsprechend mit Invoke wieder in den UI-Thread delegiert.

ach man alles so kompliziert..

Ja Threading ist ein komplexen Thema das ohne fundierte Grundlagenkenntnis schwer zu beherschen ist. Daher der Rat dass du dich mit Threading vorher intensiv(er) beschäftigst. ZB als Einstiegspunkt Threading in C#

BTW: Erstelle nicht selbst Threads sondern verwende besser den ThreadPool. Siehe dort die Methode QueueUserWorkItem oder verwende Tasks (.net 4.0).

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"