Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Note
Cet article est spécifique à .NET Framework. Ceci ne s’applique pas aux implémentations plus récentes de .NET, y compris .NET 6 et versions ultérieures.
L’Assistant contextSwitchDeadlock débogage managé (MDA) est activé lorsqu’un interblocage est détecté lors d’une tentative de transition de contexte COM.
Symptoms
Le symptôme le plus courant est qu’un appel sur un composant COM non managé à partir du code managé ne retourne pas. Un autre symptôme est l’augmentation de l’utilisation de la mémoire au fil du temps.
Cause
La cause la plus probable est qu’un thread d’appartement à thread unique (STA) ne pompe pas les messages. Le thread STA est en attente sans pomper les messages ou effectue de longues opérations et n’autorise pas la file d’attente de messages à pomper.
L’utilisation de la mémoire augmente au fil du temps est due au thread finaliseur qui tente d’appeler Release un composant COM non managé et que ce composant ne retourne pas. Cela empêche le finaliseur de récupérer d’autres objets.
Par défaut, le modèle de thread pour le thread principal des applications console Visual Basic est STA. Ce MDA est activé si un thread STA utilise l’interopérabilité COM directement ou indirectement via le Common Language Runtime ou un contrôle tiers. Pour éviter d’activer ce MDA dans une application console Visual Basic, appliquez l’attribut MTAThreadAttribute à la méthode principale ou modifiez l’application pour pomper les messages.
Il est possible que ce MDA soit activé faussement lorsque toutes les conditions suivantes sont remplies :
Une application crée des composants COM à partir de threads STA directement ou indirectement via des bibliothèques.
L’application a été arrêtée dans le débogueur et l’utilisateur a poursuivi l’application ou effectué une opération d’étape.
Le débogage non managé n’est pas activé.
Pour déterminer si le MDA est activé faussement, désactivez tous les points d’arrêt, redémarrez l’application et autorisez-la à s’exécuter sans arrêter. Si le MDA n’est pas activé, il est probable que l’activation initiale était false. Dans ce cas, désactivez le MDA pour éviter les interférences avec la session de débogage.
Note
Ce MDA est défini par défaut pour Visual Studio. Pour plus d’informations sur la désactivation des mdAs, consultez Diagnostic des erreurs avec les Assistants de débogage managé.
Résolution
Suivez les règles COM concernant le pompage des messages STA.
Effet sur le runtime
Ce MDA n’a aucun effet sur le CLR. Il signale uniquement des données sur les contextes COM.
Sortie
Message décrivant le contexte actuel et le contexte cible.
Configuration
<mdaConfig>
<assistants>
<contextSwitchDeadlock />
</assistants>
</mdaConfig>