Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Note
Questo articolo è specifico per .NET Framework. Non si applica alle implementazioni più recenti di .NET, tra cui .NET 6 e versioni successive.
L'assistente contextSwitchDeadlock al debug gestito viene attivato quando viene rilevato un deadlock durante un tentativo di transizione del contesto COM.
Symptoms
Il sintomo più comune è che una chiamata a un componente COM non gestito dal codice gestito non restituisce. Un altro sintomo è l'aumento dell'utilizzo della memoria nel tempo.
Cause
La causa più probabile è che un thread apartment a thread singolo (STA) non sta pompando i messaggi. Il thread STA è in attesa senza pompare messaggi o sta eseguendo operazioni lunghe e non consente la pompa della coda dei messaggi.
L'utilizzo della memoria che aumenta nel tempo è causato dal thread del finalizzatore che tenta di chiamare Release su un componente COM non gestito e tale componente non viene restituito. Ciò impedisce al finalizzatore di recuperare altri oggetti.
Per impostazione predefinita, il modello di threading per il thread principale delle applicazioni console di Visual Basic è STA. Questo assistente al debug gestito viene attivato se un thread STA usa l'interoperabilità COM direttamente o indirettamente tramite Common Language Runtime o un controllo di terze parti. Per evitare di attivare questo assistente al debug gestito in un'applicazione console Visual Basic, applicare l'attributo MTAThreadAttribute al metodo main o modificare l'applicazione per il pumping dei messaggi.
È possibile che questo assistente al debug gestito venga attivato in modo falso quando vengono soddisfatte tutte le condizioni seguenti:
Un'applicazione crea componenti COM da thread STA direttamente o indirettamente tramite librerie.
L'applicazione è stata arrestata nel debugger e l'utente ha continuato l'applicazione o ha eseguito un'operazione di passaggio.
Il debug non gestito non è abilitato.
Per determinare se l'assistente al debug gestito viene attivato in modo false, disabilitare tutti i punti di interruzione, riavviare l'applicazione e consentire l'esecuzione senza arrestarsi. Se l'assistente al debug gestito non è attivato, è probabile che l'attivazione iniziale sia false. In questo caso, disabilitare l'assistente al debug per evitare interferenze con la sessione di debug.
Note
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 al pumping dei messaggi STA.
Effetto sul runtime
Questo assistente al debug gestito non ha alcun effetto su CLR. Segnala solo i dati relativi ai contesti COM.
Risultato
Messaggio che descrive il contesto corrente e il contesto di destinazione.
Configuration
<mdaConfig>
<assistants>
<contextSwitchDeadlock />
</assistants>
</mdaConfig>