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>