Estou recebendo uma mensagem de erro que não consigo resolver. É originário do Visual Studio ou do depurador. Não tenho certeza se a condição de erro final está no VS, no depurador, no meu programa ou no banco de dados.
Este é um aplicativo do Windows. Não é um aplicativo da web.
A primeira mensagem do VS é uma caixa pop-up dizendo: "Nenhum símbolo é carregado para nenhum quadro da pilha de chamadas. O código-fonte não pode ser exibido". Quando isso é clicado, recebo: " ContextSwitchDeadlock foi detectado ", juntamente com uma longa mensagem reproduzida abaixo.
O erro surge em um loop que verifica uma DataTable. Para cada linha, ele usa um valor de chave (HIC #) da tabela como parâmetro para um SqlCommand. O comando é usado para criar um SqlDataReader que retorna uma linha. Os dados são comparados. Se um erro for detectado, uma linha será adicionada a uma segunda DataTable.
O erro parece estar relacionado ao tempo de execução do procedimento (ou seja, após 60 segundos), não ao número de erros encontrados. Eu não acho que seja um problema de memória. Nenhuma variável é declarada dentro do loop. Os únicos objetos criados são os SqlDataReaders e eles estão em Usando estruturas. Adicionar System.GC.Collect () não teve efeito.
O banco de dados é um site SqlServer no mesmo laptop.
Não há aparelhos ou gadgets sofisticados no formulário.
Não conheço nada neste processo que seja muito diferente do que fiz dezenas de vezes antes. Eu já vi o erro antes, mas nunca de forma consistente.
Alguma idéia, alguém?
Texto completo do erro: O CLR não conseguiu fazer a transição do contexto COM 0x1a0b88 para o contexto COM 0x1a0cf8 por 60 segundos. O encadeamento que possui o contexto / apartamento de destino provavelmente faz uma espera sem bombeamento ou processa uma operação de execução muito longa sem bombear mensagens do Windows. Essa situação geralmente tem um impacto negativo no desempenho e pode até levar o aplicativo a não responder ou o uso da memória acumular continuamente ao longo do tempo. Para evitar esse problema, todos os encadeamentos STA (Single Threaded Apartment) devem usar primitivas de espera de bombeamento (como CoWaitForMultipleHandles) e bombear rotineiramente mensagens durante operações de execução longa.
fonte
ctrl-alt-e
traz o diálogo de exceção.Debug -> Windows -> Exceptions Settings
. Em seguida, use a pesquisaComo Pedro disse, você tem um problema com o depurador que impede a bomba de mensagens se você estiver percorrendo o código.
Mas se você estiver executando uma operação de longa execução no thread da interface do usuário, chame Application.DoEvents () que explode explicitamente a fila de mensagens e, em seguida, retorna o controle ao seu método atual.
No entanto, se você estiver fazendo isso, recomendo que você analise seu design para que você possa executar o processamento fora do thread da interface do usuário para que sua interface do usuário permaneça agradável e rápida.
fonte
Parece que você está fazendo isso no thread principal da interface do usuário no aplicativo. O thread da interface do usuário é responsável por bombear mensagens do Windows conforme a chegada e, ainda assim, porque o seu está bloqueado nas chamadas do banco de dados, ele não pode fazê-lo. Isso pode causar problemas com mensagens em todo o sistema.
Você deve gerar um encadeamento em segundo plano para a operação de longa execução e criar algum tipo de diálogo "Estou ocupado" para o usuário enquanto isso acontece.
fonte
No Visual Studio 2017, desmarcou a opção ContextSwitchDeadlock:
Depuração> Windows> Configurações de exceção
Em Exception Setting Windows: Desmarque a opção ContextSwitchDeadlock
fonte
Se você não deseja desativar essa exceção, tudo o que você precisa fazer é permitir que seu aplicativo transmita algumas mensagens pelo menos uma vez a cada 60 segundos. Isso impedirá que essa exceção aconteça. Tente ligar para System.Threading.Thread.CurrentThread.Join (10) de vez em quando. Existem outras chamadas que você pode fazer para que as mensagens bombeiem.
fonte
A solução acima é boa em alguns cenários, mas há outro cenário em que isso acontece quando você está testando a unidade e tenta "Depurar testes selecionados" no Explorador de Testes quando a solução não está definida como Depuração.
Nesse caso, você precisa alterar sua solução de Release ou o que estiver definido como Debug neste caso. Se esse for o problema, alterar o "ContextSwitchDeadlock" não ajudará realmente.
Eu também perdi isso porque a mensagem de erro era tão desagradável que não verifiquei a coisa óbvia que era a configuração de Depuração!
fonte
Na versão em espanhol do Visual Studio 2017.
e pesquise "ContextSwitchDeadlock". Em seguida, desmarque. Ou atalho
Melhor.
fonte
Você pode resolver isso desmarcando contextswitchdeadlock em
Depurar-> Exceções ... -> Expandir nó MDA -> desmarcar -> contextswitchdeadlock
fonte
Eu estava recebendo esse erro e alternei as consultas para assíncrono (aguarde (...). ToListAsync ()). Tudo bem agora.
fonte