Was ist ein Thread-Exit-Code?

115

Was genau ist ein Thread-Exit-Code im Ausgabefenster beim Debuggen? Welche Informationen gibt es mir? Ist es irgendwie nützlich oder nur ein internes Zeug, das mich nicht stören sollte?

The thread 0x552c has exited with code 259 (0x103).
The thread 0x4440 has exited with code 0 (0x0).

Gibt es vielleicht eine Art Liste möglicher Exit-Codes zusammen mit ihrer Bedeutung?

Ondrej Janacek
quelle

Antworten:

100

Es scheint anscheinend nicht viele Erklärungen zu diesem Thema zu geben, aber die Exit-Codes sollen verwendet werden, um einen Hinweis darauf zu geben, wie der Thread beendet wurde. 0Dies bedeutet, dass er sicher beendet wurde, während alles andere bedeutet, dass dies nicht der Fall war nicht wie erwartet beenden. Aber dann kann dieser Exit-Code selbst in Code gesetzt werden, um dies vollständig zu übersehen.

Der nächste Link, den ich für weitere Informationen als nützlich erachten könnte, ist dieser

Zitat aus dem obigen Link:

Unabhängig von der Methode zum Beenden muss die Ganzzahl, die Sie von Ihrem Prozess oder Thread zurückgeben, Werte zwischen 0 und 255 (8 Bit) haben. Ein Nullwert zeigt Erfolg an, während ein Wert ungleich Null einen Fehler anzeigt. Obwohl Sie versuchen können, einen beliebigen Ganzzahlwert als Exit-Code zurückzugeben, wird nur das niedrigste Byte der Ganzzahl von Ihrem Prozess oder Thread als Teil eines Exit-Codes zurückgegeben. Die Bytes höherer Ordnung werden vom Betriebssystem verwendet, um spezielle Informationen über den Prozess zu übermitteln. Der Exit-Code ist sehr nützlich in Batch- / Shell-Programmen, die abhängig vom Erfolg oder Misserfolg eines Programms andere Programme bedingt ausführen.


Aus der Dokumentation zu GetEXitCodeThread

Wichtig Die GetExitCodeThread-Funktion gibt einen gültigen Fehlercode zurück, der von der Anwendung erst nach Beendigung des Threads definiert wird. Daher sollte eine Anwendung STILL_ACTIVE (259) nicht als Fehlercode verwenden. Wenn ein Thread STILL_ACTIVE (259) als Fehlercode zurückgibt , können Anwendungen, die auf diesen Wert testen, ihn so interpretieren, dass der Thread noch ausgeführt wird, und weiterhin nach Abschluss des Threads auf die Fertigstellung des Threads testen, wodurch der Thread gesetzt werden kann Anwendung in eine Endlosschleife.


Mein Verständnis von all dem ist, dass der Exit-Code nicht so wichtig ist, wenn Sie Threads in Ihrer eigenen Anwendung für Ihre eigene Anwendung verwenden. Die Ausnahme ist möglicherweise, wenn Sie mehrere Threads gleichzeitig ausführen, die voneinander abhängig sind. Wenn eine externe Quelle diesen Fehlercode lesen muss, können Sie ihn so einstellen, dass andere Anwendungen den Status Ihres Threads erfahren.

Sayse
quelle
1
Gibt es eine Möglichkeit, es aus dem Ausgabefenster zu entfernen?
Arne Evertsson
26
@ArneEvertsson - Wenn Sie in Tools | gehen Optionen ... im Bereich "Debugging \ Ausgabefenster" gibt es die Einstellung "Thread-Exit-Nachrichten" (Ein | Aus).
Josh Poley
2
Dies kann bedeuten, dass Sie asynchrone Methoden in einem Hauptthread einer synchronen Anwendung verwenden und nicht darauf warten, dass sie beendet werden. Der einfachste Weg, um damit umzugehen, besteht darin, Wait () für eine Aufgabe aufzurufen, die von einer anderen Methode gestartet und zurückgegeben wurde, wie in diesem Beispiel gezeigt: asp.net/web-api/overview/advanced/… RunAsync().Wait();
Bron Davies
1
Der @ PoolDavies-Thread-Pool-Thread wird auch nach dem Aufruf von Wait () mit dem Fehlercode 259 beendet. Hier ist mein Code: static void Main(string[] args) { var t = new Task<object>(() => SomeOp(2)); t.Start(); t.Wait(); }Die Sache ist, Aufgaben werden von Thread-Pool-Threads ausgeführt und basierend auf den Heuristiken des Thread-Pools wird der Thread möglicherweise auch nach Abschluss Ihrer Aufgabe nicht beendet. Der Thread kehrt einfach zum Thread-Pool zurück und wartet darauf, mit der nächsten Aufgabe zugewiesen zu werden. Und deshalb klingt der Exit-Code STILL_ACTIVE (259) hier so intuitiv.
RBT
Der Artikel im Link ist falsch. Es ist nicht erforderlich, dass ein Thread-Exit-Code (oder ein Prozess-Exit-Code) nur ein einzelnes Byte ist.
Harry Johnston
55

Wie Sayse erwähnt hat der Exit-Code 259 (0x103)eine besondere Bedeutung. In diesem Fall wird der zu debuggende Prozess noch ausgeführt.

Ich habe dies häufig beim Debuggen von Webdiensten gesehen, da der Thread nach dem Ausführen jedes Webdienstaufrufs weiterhin ausgeführt wird (da er immer noch auf weitere Aufrufe wartet).

Kristian Williams
quelle
7
Weitere Informationen .. Im Allgemeinen wird jeder Thread, der dem Thread-Pool gehört, mit 259 beendet. Siehe: stackoverflow.com/questions/21632584/…
Skrymsli
Ich habe mich gefragt, was dies bedeutet, und Ihre Antwort war genau das, was ich beim Ausführen meiner C # -Konsolen-App gesehen habe. Vielen Dank!
KayleeFrye_onDeck
0

Was mir passiert ist, ist, dass ich mehrere Projekte in meiner Lösung habe. Ich wollte Projekt 1 debuggen, aber das Projekt 2 wurde als Standardstartprojekt festgelegt. Ich habe dies behoben, indem ich mit der rechten Maustaste auf das Projekt geklickt und "Als Startprojekt festlegen" ausgewählt habe. Dann ist das Ausführen des Debuggens in Ordnung.

Feng Zhang
quelle
1
Ich sehe das Debuggen von Nachrichten im Ausgabefenster nicht als Probleme. Ich war nur neugierig, was sie sind und nicht, wie ich sie loswerden kann.
Ondrej Janacek