Cos'è un codice di uscita del thread?


115

Che cos'è esattamente un codice di uscita del thread nella finestra di output durante il debug? Quali informazioni mi fornisce? È in qualche modo utile o solo una roba interna che non dovrebbe disturbarmi?

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

Esiste forse una sorta di elenco di possibili codici di uscita insieme al suo significato?

Risposte:


100

In realtà non sembra che ci siano molte spiegazioni su questo argomento a quanto pare ma i codici di uscita dovrebbero essere usati per dare un'indicazione su come il thread è uscito, 0tende a significare che è uscito in sicurezza mentre qualsiasi altra cosa tende a significare che non l'ha fatto uscire come previsto. Ma poi questo codice di uscita può essere impostato nel codice da solo per trascurarlo completamente.

Il link più vicino che ho trovato utile per ulteriori informazioni è questo

Citazione dal link sopra:

Qualunque sia il metodo di uscita, il numero intero restituito dal processo o dal thread deve essere un valore compreso tra 0 e 255 (8 bit). Un valore zero indica il successo, mentre un valore diverso da zero indica il fallimento. Sebbene sia possibile tentare di restituire qualsiasi valore intero come codice di uscita, solo il byte più basso dell'intero viene restituito dal processo o dal thread come parte di un codice di uscita. I byte di ordine superiore vengono utilizzati dal sistema operativo per trasmettere informazioni speciali sul processo. Il codice di uscita è molto utile nei programmi batch / shell che eseguono in modo condizionale altri programmi a seconda del successo o del fallimento di uno.


Dalla documentazione per GetEXitCodeThread

Importante La funzione GetExitCodeThread restituisce un codice di errore valido definito dall'applicazione solo al termine del thread. Pertanto, un'applicazione non dovrebbe utilizzare STILL_ACTIVE (259) come un codice di errore. Se un thread restituisce STILL_ACTIVE (259) come codice di errore, le applicazioni che testano questo valore potrebbero interpretarlo nel senso che il thread è ancora in esecuzione e continuare a testare il completamento del thread dopo che il thread è terminato, il che potrebbe mettere il applicazione in un ciclo infinito.


La mia comprensione di tutto ciò è che il codice di uscita non ha molta importanza se si utilizzano thread all'interno della propria applicazione per la propria applicazione. L'eccezione è forse se stai eseguendo un paio di thread allo stesso tempo che hanno una dipendenza l'uno dall'altro. Se è necessario che una fonte esterna legga questo codice di errore, è possibile impostarlo in modo che altre applicazioni conoscano lo stato del thread.


1
C'è un modo per sbarazzarsene dalla finestra di output?
Arne Evertsson

26
@ArneEvertsson - Se vai in Strumenti | Opzioni ... nell'area "Debug \ Finestra di output", è presente l'impostazione "Messaggi di uscita dal thread" (On | Off).
josh poley

2
Ciò può significare che stai usando metodi asincroni all'interno di un thread principale dell'applicazione sincrona e non stai aspettando che finiscano. Il modo più semplice per risolvere questo problema è chiamare Wait () su un'attività avviata e restituita da un altro metodo come mostrato in questo esempio: asp.net/web-api/overview/advanced/… RunAsync().Wait();
Bron Davies

1
Il thread del pool di thread @BronDavies termina con il codice di errore 259 anche dopo aver chiamato Wait (). Ecco il mio codice: static void Main(string[] args) { var t = new Task<object>(() => SomeOp(2)); t.Start(); t.Wait(); }il fatto è che le attività vengono eseguite dai thread del pool di thread e, in base all'euristica del pool di thread, potrebbe non terminare il thread anche dopo che l'attività è terminata. Il thread torna semplicemente al pool di thread in attesa di essere assegnato con l'attività successiva. Ed è per questo che il codice di uscita STILL_ACTIVE (259) suona così intuitivo qui.
RBT

L'articolo nel collegamento è sbagliato. Non è necessario che un codice di uscita del thread (o un codice di uscita del processo, del resto) sia solo un singolo byte.
Harry Johnston,

55

Come ha detto Sayse, il codice di uscita 259 (0x103)ha un significato speciale, in questo caso il processo di cui si sta eseguendo il debug è ancora in esecuzione.

L'ho visto spesso con il debug dei servizi Web, perché il thread continua a essere eseguito dopo aver eseguito ogni chiamata al servizio Web (poiché è ancora in ascolto di ulteriori chiamate).


7
Maggiori informazioni .. in generale qualsiasi filo che è di proprietà del pool di thread uscirà con 259. See: stackoverflow.com/questions/21632584/...
Skrymsli

Mi chiedevo cosa significasse e la tua risposta è stata esattamente ciò che stavo vedendo mentre eseguivo la mia app per console C #. Grazie!
kayleeFrye_onDeck

0

quello che mi è successo è che ho più progetti nella mia soluzione. Intendevo eseguire il debug del progetto 1, tuttavia, il progetto 2 è stato impostato come progetto iniziale predefinito. Ho risolto questo problema, fai clic con il pulsante destro del mouse sul progetto e seleziona "Imposta come progetto di avvio", quindi eseguire il debug va bene.


1
Non vedo i messaggi di debug nella finestra di output come problemi. Ero solo curioso di sapere cosa fossero, non come sbarazzarsene.
Ondrej Janacek
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.