Partilhar via


Exceções em threads gerenciado

No .NET estrutura versão 2.0, o Common linguagem tempo de execução permite mais exceções sem tratamento em threads para continuar naturalmente.Na maioria dos casos, isso significa que a exceção sem tratamento faz com que o aplicativo terminar.

Observação:

Esta é uma alterar significativa das versões de .NET estrutura 1.0 e 1.1, que fornecer uma opção para muitas exceções não tratadas — por exemplo, sem tratamento exceções em threads do pool de threads.Consulte Alterar de versões anteriores neste tópico.

O Common linguagem tempo de execução fornece uma opção para certas exceções sem tratamento são usadas para controlar o fluxo de programa:

  • A ThreadAbortException é acionada em um thread porque Abort foi chamado.

  • An AppDomainUnloadedException é lançada em um thread porque o domínio do aplicativo no qual o thread está em execução está sendo descarregado.

  • O common linguagem tempo de execução ou um processo de host encerra o thread, lançando uma exceção interna.

Se qualquer uma das seguintes exceções sem tratamento em threads criados pelo Common linguagem tempo de execução, a exceção encerra o thread, mas o Common linguagem tempo de execução não permite que a exceção continuar ainda mais.

Se essas exceções sem tratamento no thread principal ou em segmentos que inseriu o tempo de execução do código não gerenciado, eles prossiga normalmente, resultando no encerramento do aplicativo.

Observação:

É possível que o tempo de execução lançar uma exceção sem tratamento antes de qualquer código gerenciado tenha tido a oportunidade de instalar um manipulador de exceção.Mesmo que o código gerenciado não tido nenhuma oportunidade de se lidar com tal exceção, a exceção é permitida continuar naturalmente.

Expondo Threading problemas durante o desenvolvimento

Ao threads têm permissão para falhar silenciosamente, sem encerrar o aplicativo, sérios problemas de programação podem ficar sem serem detectados.Este é um problema específico para serviços e outros aplicativos que são executados por períodos prolongados.sistema autônomo threads falham, estado de programa gradualmente for corrompido.Pode prejudicar o desempenho do aplicativo, ou pode parar o aplicativo.

Permitindo exceções sem tratamento em threads para continuar naturalmente, até que o sistema operacional encerra o programa expõe esses problemas durante o desenvolvimento e teste.Erro relatórios sobre o programa demissões suporte a depuração.

Alterar de versões anteriores

A alterar mais significativa relação aos threads gerenciado.Nas versões do .NET estrutura 1.0 e 1.1, o Common linguagem tempo de execução fornece uma opção para exceções não tratadas nas seguintes situações:

  • Existe nenhuma sistema autônomo uma exceção sem tratamento em um thread do pool de segmento.Quando uma tarefa lança uma exceção não processa, o tempo de execução imprime o rastreamento de pilha de exceção para o console e, em seguida, retorna o thread para o pool de segmentos.

  • Existe nenhuma sistema autônomo uma exceção sem tratamento em um thread criado com o Start método para o Thread classe. Quando o código em execução em um thread de tal lança uma exceção que ele não tratar, o tempo de execução imprime o rastreamento de pilha de exceção para o console e normalmente é encerrado o thread.

  • Existe nenhuma sistema autônomo uma exceção sem tratamento no thread do finalizador.Quando um finalizador lança uma exceção não processa, o tempo de execução imprime o rastreamento de pilha de exceção para o console e permite que o thread do finalizador continuar a execução de finalizadores.

O status de primeiro plano ou plano de fundo de um thread gerenciado não afeta este comportamento.

Para exceções sem tratamento em threads originado em código não gerenciado, a diferença é mais sutil.A caixa de diálogo Anexar JIT do tempo de execução preempts a caixa de diálogo do sistema operacional para exceções gerenciadas ou exceções nativas em threads que passaram por meio de código nativo.O processo termina em todos os casos.

Migrando o código

Em geral, a alterar irá expor problemas anteriormente não reconhecidos de programação para que possam ser corrigidos.Em alguns casos, no entanto, os programadores podem ter deixado proveito da proteção em tempo de execução, por exemplo, para terminar threads.Dependendo da situação, eles devem considerar uma das seguintes estratégias de migração:

  • Reestruture o código para que o segmento é encerrado normalmente quando é recebido um sinal.

  • Use o Thread.Abort método anule o thread.

  • Se um segmento deve ser interrompido para que você possa continuar o processo de encerramento do processo, faça o thread de um thread de segundo plano para que seja automaticamente cancelado na sair do processo.

Em todos os casos, a estratégia deve seguir as diretrizes de design para exceções.Consulte Diretrizes de design para exceções.

sinalizar de compatibilidade de aplicativo

sistema autônomo medida de compatibilidade temporários, sistema autônomo administradores podem colocar um sinalizar de compatibilidade o <runtime> seção do arquivo de configuração do aplicativo. Isso faz com que o Common linguagem tempo de execução para reverter para o comportamento das versões 1.0 e 1.1.

<legacyUnhandledExceptionPolicy enabled="1"/>

substituir de host

No .NET estrutura versão 2.0, um host não gerenciado pode usar o ICLRPolicyManager interface na API de hospedagem para substituir a diretiva de exceção sem tratamento padrão do common linguagem tempo de execução.The ICLRPolicyManager::SetUnhandledExceptionPolicy função é usada para conjunto a diretiva para exceções não tratadas.

Consulte também

Outros recursos

Gerenciado Threading Basics