contextSwitchDeadlock MDA

Note

Este artigo é específico do .NET Framework. Ele não se aplica a implementações mais recentes do .NET, incluindo o .NET 6 e versões posteriores.

O assistente contextSwitchDeadlock de depuração gerido (MDA) é ativado quando é detetado um bloqueio durante uma tentativa de transição de contexto COM.

Sintomas

O sintoma mais comum é que uma chamada num componente COM não gerido a partir de código gerido não retorna. Outro sintoma é o aumento do uso de memória ao longo do tempo.

Motivo

A causa mais provável é que uma thread single-threaded apartment (STA) não esteja a enviar mensagens. O thread STA está ou à espera sem bombear mensagens ou está a realizar operações longas e não permite que a fila de mensagens bombee.

O aumento do uso de memória ao longo do tempo é causado pelo thread finalizer tentar aceder Release a um componente COM não gerido e esse componente não regressa. Isto impede que o finalizador recupere outros objetos.

Por defeito, o modelo de threading para o thread principal das aplicações de consola Visual Basic é STA. Este MDA é ativado se um thread STA utilizar interoperabilidade COM, direta ou indiretamente, através do runtime de linguagem comum ou de um controlo de terceiros. Para evitar ativar este MDA numa aplicação de consola Visual Basic, aplique o MTAThreadAttribute atributo ao método principal ou modifique a aplicação para bombear mensagens.

É possível que esta MDA seja falsamente ativada quando todas as seguintes condições são cumpridas:

  • Uma aplicação cria componentes COM a partir de threads STA, direta ou indiretamente, através de bibliotecas.

  • A aplicação era interrompida no depurador e o utilizador ou continuava a aplicação ou realizava uma operação por etapas.

  • A depuração não gerida não está ativada.

Para determinar se o MDA está a ser ativado incorretamente, desative todos os pontos de interrupção, reinicie a aplicação e permita que funcione sem parar. Se a MDA não for ativada, é provável que a ativação inicial tenha sido falsa. Neste caso, desative o MDA para evitar interferências com a sessão de depuração.

Note

Este MDA está no conjunto padrão do Visual Studio. Para informações sobre como desativar MDAs, consulte Diagnóstico de Erros com Assistentes de Depuração Geridos.

Resolução

Siga as regras do COM relativamente ao bombeamento de mensagens STA.

Efeito no tempo de execução

Este MDA não tem efeito no CLR. Só reporta dados sobre contextos COM.

Output

Uma mensagem que descreve o contexto atual e o contexto de destino.

Configuração

<mdaConfig>
  <assistants>
    <contextSwitchDeadlock />
  </assistants>
</mdaConfig>

Ver também