contextSwitchDeadlock MDA
Kommentar
Den här artikeln är specifik för .NET Framework. Det gäller inte för nyare implementeringar av .NET, inklusive .NET 6 och senare versioner.
Den contextSwitchDeadlock
hanterade felsökningsassistenten (MDA) aktiveras när ett dödläge identifieras under ett försök till COM-kontextövergång.
Symtom
Det vanligaste problemet är att ett anrop på en ohanterad COM-komponent från hanterad kod inte returneras. Ett annat symptom är att minnesanvändningen ökar med tiden.
Orsak
Den mest sannolika orsaken är att en sta-tråd (single-threaded apartment) inte pumpar meddelanden. STA-tråden väntar antingen utan att pumpa meddelanden eller utför långa åtgärder och tillåter inte att meddelandekön pumpar.
Minnesanvändningen ökar med tiden orsakas av att finalizertråden försöker anropa Release
en ohanterad COM-komponent och att komponenten inte returneras. Detta förhindrar att finalizern återtar andra objekt.
Som standard är trådningsmodellen för huvudtråden i Visual Basic-konsolprogram STA. Denna MDA aktiveras om en STA-tråd använder COM-samverkan direkt eller indirekt via den gemensamma språkkörningen eller en kontroll från tredje part. Om du vill undvika att aktivera denna MDA i ett Visual Basic-konsolprogram använder du MTAThreadAttribute attributet för huvudmetoden eller ändrar programmet för att pumpa meddelanden.
Det är möjligt att denna MDA aktiveras felaktigt när alla följande villkor uppfylls:
Ett program skapar COM-komponenter från STA-trådar antingen direkt eller indirekt via bibliotek.
Programmet stoppades i felsökningsprogrammet och användaren fortsatte antingen programmet eller utförde en stegåtgärd.
Ohanterad felsökning är inte aktiverat.
För att avgöra om MDA aktiveras felaktigt inaktiverar du alla brytpunkter, startar om programmet och tillåter att det körs utan att stoppa. Om MDA inte är aktiverat är det troligt att den första aktiveringen var falsk. I det här fallet inaktiverar du MDA för att undvika störningar i felsökningssessionen.
Kommentar
Denna MDA finns i standarduppsättningen för Visual Studio. Information om hur du inaktiverar MDA finns i Diagnostisera fel med hanterade felsökningsassistenter.
Åtgärd
Följ COM-reglerna för STA-meddelandepumpning.
Effekt på körningen
Denna MDA har ingen effekt på CLR. Den rapporterar endast data om COM-kontexter.
Output
Ett meddelande som beskriver den aktuella kontexten och målkontexten.
Konfiguration
<mdaConfig>
<assistants>
<contextSwitchDeadlock />
</assistants>
</mdaConfig>