Ce este un cod de ieșire al firului? (Programare, C#, Multithreading, Depanare, Cod De Ieșire)

Ondrej Janacek a intrebat.

Ce este mai exact un cod de ieșire a firului în fereastra de ieșire în timpul depanării? Ce informații îmi oferă? Este cumva utilă sau este doar o chestie internă care nu ar trebui să mă deranjeze?

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

Există poate un fel de listă a codurilor de ieșire posibile împreună cu semnificația lor?

3 răspunsuri
Sayse

De fapt, nu pare să existe prea multe explicații pe acest subiect aparent, dar codurile de ieșire ar trebui să fie folosite pentru a da o indicație asupra modului în care a ieșit firul, 0 tinde să însemne că a ieșit în siguranță, în timp ce orice altceva tinde să însemne că nu a ieșit așa cum era de așteptat. Dar acest cod de ieșire poate fi setat în cod de către dvs. pentru a ignora complet acest lucru.

Cel mai apropiat link pe care l-am putut găsi ca fiind util pentru mai multe informații este acest

Citez din link-ul de mai sus:

Oricare ar fi metoda de ieșire, numărul întreg pe care îl returnezi de la procesul sau firul de execuție trebuie să fie valori cuprinse între 0-255 (8 biți). O valoare zero indică succesul, în timp ce o valoare diferită de zero indică un eșec. Cu toate că puteți încerca să returnați orice valoare întreagă ca și cod de ieșire, numai cel mai mic octet al numărului întreg este returnat de la proces sau de la fire ca parte a unui cod de ieșire. Octeții de ordin superior sunt utilizați de sistemul de operare pentru a transmite informații speciale despre proces. Codul de ieșire este foarte util în programele batch/shell care execută condiționat alte programe în funcție de succesul sau eșecul unuia dintre ele.


Din documentația pentru GetEXitCodeThread

Important Funcția GetExitCodeThread returnează un cod de eroare valid definit de aplicație numai după ce firul se termină. Prin urmare, o aplicație nu ar trebui să utilizeze STILL_ACTIVE (259) ca și cod de eroare. În cazul în care un fir returnează STILL_ACTIVE (259) ca și cod de eroare, aplicațiile care testează această valoare ar putea interpreta această valoare ca însemnând că firul este încă în curs de execuție și ar putea continua să testeze finalizarea firului după ce acesta s-a încheiat, ceea ce ar putea plasa aplicația într-o buclă infinită.


Din câte am înțeles eu, codul de ieșire nu contează foarte mult dacă utilizați fire de execuție în cadrul propriei aplicații. pentru propria aplicație. Excepția este, eventual, dacă rulați în același timp câteva fire de execuție care au o dependență una față de cealaltă. Dacă există o cerință ca o sursă externă să citească acest cod de eroare, atunci îl puteți seta pentru a permite altor aplicații să cunoască starea firului dumneavoastră.

Comentarii

  • Există o modalitate de a scăpa de el din fereastra de ieșire? –  > Por Arne Evertsson.
  • 26

  • @ArneEvertsson – Dacă intrați în Tools | Options… în zona „DebuggingOutput Window”, există o setare „Thread Exit Messages” (On|Off). –  > Por josh poley.
  • Acest lucru poate însemna că utilizați metode asincrone în cadrul unui fir principal al aplicației sincrone și nu așteptați ca acestea să se termine. Cel mai simplu mod de a rezolva această problemă este să apelați Wait() pe un Task inițiat și returnat de o altă metodă, așa cum se arată în acest exemplu: asp.net/web-api/overview/advanced/… RunAsync().Wait(); –  > Por Bron Davies.
  • @BronDavies thread-pool thread-ul iese cu codul de eroare 259 chiar și după apelarea Wait(). Iată codul meu: static void Main(string[] args) { var t = new Task<object>(() => SomeOp(2)); t.Start(); t.Wait(); } Chestia este că, sarcinile sunt executate de firele de tip thread pool și, pe baza euristicii thread pool-ului, s-ar putea să nu încheie firul chiar și după ce sarcina dvs. s-a terminat. Firul se întoarce pur și simplu în grupul de fire care așteaptă să fie repartizat la următoarea sarcină. De aceea, codul de ieșire STILL_ACTIVE (259) pare atât de intuitiv în acest caz. –  > Por RBT.
  • Articolul din link este greșit. Nu există nicio cerință ca un cod de ieșire din fir (sau un cod de ieșire din proces, de altfel) să fie doar un singur octet. –  > Por Harry Johnston.
Kristian Williams

După cum a menționat Sayse, codul de ieșire 259 (0x103) are o semnificație specială, în acest caz procesul care este depanat este încă în curs de execuție.

Am văzut acest lucru de multe ori la depanarea serviciilor web, deoarece firul continuă să ruleze după executarea fiecărui apel de serviciu web (deoarece încă mai ascultă pentru apeluri ulterioare).

Comentarii

  • Mai multe informații… în general, orice fir care este deținut de thread pool-ul de fire va ieși cu 259. Vedeți: stackoverflow.com/questions/21632584/… –  > Por Skrymsli.
  • Mă întrebam ce înseamnă acest lucru, iar răspunsul dvs. a fost exact ceea ce am văzut în timp ce îmi rulam aplicația de consolă C#. Mulțumesc! –  > Por kayleeFrye_onDeck.
Feng Zhang

ceea ce mi s-a întâmplat mie este că am mai multe proiecte în soluția mea. Am vrut să depanez proiectul 1, însă proiectul 2 a fost setat ca proiect de pornire implicit. Am rezolvat acest lucru prin, faceți clic dreapta pe proiect și selectați „Setați ca proiect de pornire”, apoi executarea depanării este în regulă.

Comentarii

  • Nu văd mesaje de depanare în fereastra de ieșire ca probleme. Eram doar curios ce sunt, nu cum să scap de ele. –  > Por Ondrej Janacek.