Compartilhar via


Erro: a avaliação da função 'function' ultrapassou o tempo limite e precisou ser interrompida de forma insegura

Texto completo da mensagem: A avaliação da função 'function' excedeu o tempo limite e teve que ser interrompida de maneira insegura. O problema pode causar dano à integridade do processo de destino.

Para facilitar a inspeção do estado dos objetos .NET, o depurador forçará automaticamente o processo depurado a executar código adicional (normalmente métodos getter de propriedade e funções ToString). Na maioria dos cenários, essas funções são concluídas rapidamente e facilitam a depuração. No entanto, o depurador não executa o aplicativo em um sandbox. Como resultado, um acessador de propriedade ou um método ToString que chama uma função nativa que deixa de responder pode levar a longos tempos de espera que podem não ser recuperáveis. Se você encontrar essa mensagem de erro, isso ocorreu.

Um motivo comum para esse problema é que, quando o depurador avalia uma propriedade, ele só permite que o thread que está sendo inspecionado seja executado. Portanto, se a propriedade estiver aguardando que outros threads sejam executados dentro do aplicativo depurado e se estiver aguardando de uma maneira que o Runtime do .NET não seja capaz de interromper, esse problema ocorrerá.

Para corrigir este erro

Consulte as seções a seguir para obter várias soluções possíveis para esse problema.

Solução nº 1: impedir que o depurador chame a propriedade getter ou o método ToString

A mensagem de erro informa o nome da função que o depurador tentou chamar. Se você puder modificar essa função, poderá impedir que o depurador chame o acessador de propriedade ou o método ToString(). Experimente um dos seguintes procedimentos:

  • Altere o método para algum outro tipo de código além de um método de propriedade getter ou ToString e o problema desaparecerá.

    - ou -

  • (Para ToString) Defina um atributo DebuggerDisplay no tipo e você pode fazer com que o depurador avalie algo diferente de ToString.

    - ou -

  • (Para um acessador de propriedade) Coloque o atributo System.Diagnostics.DebuggerBrowsable(DebuggerBrowsableState.Never) na propriedade. Isso pode ser útil se você tiver um método que precise permanecer uma propriedade por motivos de compatibilidade de API, mas ele realmente deve ser um método.

Solução nº 2: fazer com que o código alvo peça ao depurador para interromper a avaliação

A mensagem de erro informa o nome da função que o depurador tentou chamar. Se o acessador de propriedade ou o método ToString às vezes não funcionarem corretamente, especialmente em situações em que o problema é que o código precisa de outro thread, a função de implementação pode chamar System.Diagnostics.Debugger.NotifyOfCrossThreadDependency para pedir ao depurador para cancelar a avaliação da função. Com essa solução, ainda é possível avaliar explicitamente essas funções, mas o comportamento padrão é que a execução é interrompida quando ocorre a chamada NotifyOfCrossThreadDependency.

Solução nº 3: Desabilitar toda a avaliação implícita

Se as soluções anteriores não corrigirem o problema, você poderá desabilitar a opção Habilitar avaliação de propriedade e outras chamadas de função implícitas . Essa configuração desabilita a maioria das avaliações de função implícitas e deve resolver o problema.

No painel Ferramentas>Opções, expanda a seção Todas as Configurações>Depuração>Geral e desmarque a opção Habilitar avaliação de propriedade e outras chamadas de função implícitas.

Na caixa de diálogo Ferramentas>Opções, expanda a seção Depuração>Geral e desmarque a caixa de seleção Habilitar avaliação de propriedade e outras chamadas de função implícitas.

Solução nº 4: verificar a compatibilidade com ferramentas de desenvolvedor de terceiros

Se você estiver usando o Resharper, consulte esse problema para obter sugestões.