O que é um código de saída de thread?

115

O que exatamente é um código de saída de thread na janela Saída durante a depuração? Que informações ele me dá? É de alguma forma útil ou apenas algo interno que não deveria me incomodar?

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

Existe talvez algum tipo de lista de códigos de saída possíveis junto com seu significado?

Ondrej Janacek
fonte

Respostas:

100

Na verdade, não parece haver muita explicação sobre este assunto, mas os códigos de saída devem ser usados ​​para dar uma indicação de como o tópico saiu, 0tende a significar que saiu com segurança, enquanto qualquer outra coisa tende a significar que não não saia como esperado. Mas então esse código de saída pode ser definido por você mesmo para ignorar isso completamente.

O link mais próximo que poderia ser útil para obter mais informações é este

Citação do link acima:

Qualquer que seja o método de saída, o inteiro que você retorna de seu processo ou thread deve ter valores de 0 a 255 (8 bits). Um valor zero indica sucesso, enquanto um valor diferente de zero indica falha. Embora você possa tentar retornar qualquer valor inteiro como um código de saída, apenas o byte mais baixo do inteiro é retornado de seu processo ou thread como parte de um código de saída. Os bytes de ordem superior são usados ​​pelo sistema operacional para transmitir informações especiais sobre o processo. O código de saída é muito útil em programas em lote / shell que executam condicionalmente outros programas dependendo do sucesso ou da falha de um deles.


Da documentação para GetEXitCodeThread

Importante A função GetExitCodeThread retorna um código de erro válido definido pelo aplicativo somente depois que o thread termina. Portanto, um aplicativo não deve usar STILL_ACTIVE (259) como um código de erro. Se um encadeamento retornar STILL_ACTIVE (259) como um código de erro, os aplicativos que testam esse valor podem interpretar isso como significando que o encadeamento ainda está em execução e continuar a testar a conclusão do encadeamento após o término do encadeamento, o que pode colocar o aplicação em um loop infinito.


Meu entendimento de tudo isso é que o código de saída não importa muito se você estiver usando threads em seu próprio aplicativo para seu próprio aplicativo. A exceção é possivelmente se você estiver executando algumas threads ao mesmo tempo que dependem umas das outras. Se houver um requisito de uma fonte externa para ler este código de erro, você pode configurá-lo para permitir que outros aplicativos saibam o status do seu thread.

Sayse
fonte
1
Existe uma maneira de se livrar dele na janela de saída?
Arne Evertsson
26
@ArneEvertsson - Se você for em Ferramentas | Opções ... na área "Debugging \ Output Window", há uma configuração "Thread Exit Messages" (On | Off).
josh poley 01 de
2
Isso pode significar que você está usando métodos assíncronos em um thread principal de aplicativo síncrono e não está esperando que eles terminem. A maneira mais fácil de lidar com isso é chamar Wait () em uma tarefa iniciada e retornada por outro método, conforme mostrado neste exemplo: asp.net/web-api/overview/advanced/… RunAsync().Wait();
Bron Davies
1
O thread do pool de threads @BronDavies sai com o código de erro 259, mesmo depois de chamar Wait (). Aqui está meu código: static void Main(string[] args) { var t = new Task<object>(() => SomeOp(2)); t.Start(); t.Wait(); }O fato é que as tarefas são executadas por threads de pool de threads e, com base na heurística do pool de threads, pode não encerrar a thread mesmo depois que sua tarefa for concluída. O encadeamento simplesmente retorna ao pool de encadeamentos aguardando para ser atribuído à próxima tarefa. E é por isso que o código de saída STILL_ACTIVE (259) parece tão intuitivo aqui.
RBT
O artigo no link está errado. Não há nenhum requisito de que um código de saída de thread (ou um código de saída de processo, nesse caso) seja apenas um único byte.
Harry Johnston de
55

Como Sayse mencionou, o código de saída 259 (0x103)tem um significado especial, neste caso, o processo que está sendo depurado ainda está em execução.

Eu vi muito isso com a depuração de serviços da web, porque o thread continua a ser executado após a execução de cada chamada de serviço da web (pois ainda está escutando outras chamadas).

Kristian Williams
fonte
7
Mais informações .. geralmente qualquer thread pertencente ao pool de threads sairá com 259. Consulte: stackoverflow.com/questions/21632584/…
Skrymsli
Eu estava me perguntando o que isso significava e sua resposta foi exatamente o que eu estava vendo ao executar meu aplicativo de console C #. Obrigado!
kayleeFrye_onDeck
0

o que aconteceu comigo é que tenho vários projetos em minha solução. Eu pretendia depurar o projeto 1, no entanto, o projeto 2 foi definido como o projeto inicial padrão. Eu consertei isso, clique com o botão direito no projeto e selecione "Definir como projeto de inicialização" e, em seguida, execute a depuração.

Feng Zhang
fonte
1
Não vejo mensagens de depuração na janela de saída como problemas. Eu só estava curioso para saber o que são, não como me livrar deles.
Ondrej Janacek