Condividi tramite


MDA contextSwitchDeadlock

Nota

Questo articolo è specifico per .NET Framework. Non si applica alle implementazioni più recenti di .NET, incluse .NET 6 e versioni successive.

L'assistente al debug gestito contextSwitchDeadlock viene attivato quando viene rilevato un deadlock durante un tentativo di transizione del contesto COM.

Sintomi

Il sintomo più comune è che una chiamata su un componente COM non gestito dal codice gestito non restituisce risultati. Un altro sintomo è l'aumento dell'utilizzo della memoria nel tempo.

Causa

La causa più probabile è che il thread di un apartment a thread singolo non stia distribuendo i messaggi. Il thread dell'apartment a thread singolo potrebbe essere in attesa senza distribuire i messaggi o eseguire operazioni prolungate che non consentono la distribuzione della coda dei messaggi.

L'aumento dell'utilizzo della memoria nel tempo è determinato dal thread finalizzatore che tenta di chiamare Release su un componente COM non gestito e che il componente non restituisca risultati. Questo impedisce al finalizzatore di recuperare altri oggetti.

Per impostazione predefinita, il modello di threading per il thread principale delle applicazioni console Visual Basic è l'apartment a thread singolo. L'assistente al debug gestito viene attivato se un thread dell'apartment a thread singolo usa l'interoperabilità COM direttamente o indirettamente tramite Common Language Runtime o un controllo di terze parti. Per evitare di attivare l'assistente al debug gestito in un'applicazione console Visual Basic, applicare l'attributo MTAThreadAttribute al metodo principale o modificare l'applicazione affinché distribuisca i messaggi.

È possibile che l'assistente al debug gestito venga attivato quando vengono soddisfatte tutte le condizioni seguenti:

  • Un'applicazione crea componenti COM da thread dell'apartment a thread singolo direttamente o indirettamente tramite le librerie.

  • L'applicazione è stata interrotta nel debugger e l'utente ha continuato l'applicazione o eseguito un'operazione del passaggio.

  • Il debug non gestito non è abilitato.

Per stabilire se l'assistente al debug gestito è stato falsamente abilitato, disabilitare tutti i punti di interruzione, riavviare l'applicazione e consentirne l'esecuzione senza interruzioni. Se l'assistente al debug gestito non è attivata, è probabile che l'attivazione iniziale fosse falsa. In questo caso, disabilitare l'assistente al debug gestito per evitare interferenze con la sessione di debug.

Nota

Questo assistente al debug gestito è nel set predefinito per Visual Studio. Per informazioni su come disabilitare l'assistente al debug gestito, vedere Diagnosi degli errori con gli assistenti al debug gestito.

Risoluzione

Seguire le regole COM relative alla distribuzione di messaggi di apartment a thread singolo.

Effetto sull'ambiente di esecuzione

L'assistente al debug gestito non ha alcun effetto su CLR. Fornisce solo dati sui contesti COM.

Output

Messaggio che descrive il contesto corrente e il contesto di destinazione.

Impostazione

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

Vedi anche