contextSwitchDeadlock MDA
Uwaga
Ten artykuł jest specyficzny dla programu .NET Framework. Nie ma zastosowania do nowszych implementacji platformy .NET, w tym .NET 6 i nowszych wersji.
Asystent contextSwitchDeadlock
zarządzanego debugowania (MDA) jest aktywowany po wykryciu zakleszczenia podczas próby przejścia kontekstu COM.
Objawy
Najczęstszym objawem jest to, że wywołanie niezarządzanego składnika COM z kodu zarządzanego nie zwraca. Innym objawem jest zwiększenie użycia pamięci w czasie.
Przyczyna
Najbardziej prawdopodobną przyczyną jest to, że jednowątkowy wątek mieszkania (STA) nie pompuje wiadomości. Wątek STA czeka bez pompowania komunikatów lub wykonuje długotrwałe operacje i nie zezwala na pompowanie kolejki komunikatów.
Zwiększenie użycia pamięci w czasie jest spowodowane przez wątek finalizatora próbujący wywołać Release
niezarządzany składnik COM i ten składnik nie jest zwracany. Zapobiega to odzyskiwaniu innych obiektów przez finalizator.
Domyślnie model wątków dla głównego wątku aplikacji konsolowych Visual Basic to STA. To rozwiązanie MDA jest aktywowane, jeśli wątek STA używa współdziałania modelu COM bezpośrednio lub pośrednio za pośrednictwem środowiska uruchomieniowego języka wspólnego lub kontroli innej firmy. Aby uniknąć aktywowania tego rozwiązania MDA w aplikacji konsolowej Visual Basic, zastosuj MTAThreadAttribute atrybut do metody main lub zmodyfikuj aplikację w celu pompowania komunikatów.
Istnieje możliwość, że ta usługa MDA zostanie fałszywie aktywowana, gdy zostaną spełnione wszystkie następujące warunki:
Aplikacja tworzy składniki COM z wątków STA bezpośrednio lub pośrednio za pośrednictwem bibliotek.
Aplikacja została zatrzymana w debugerze, a użytkownik kontynuował aplikację lub wykonał operację kroku.
Debugowanie niezarządzane nie jest włączone.
Aby określić, czy usługa MDA jest aktywowana fałszywie, wyłącz wszystkie punkty przerwania, uruchom ponownie aplikację i zezwól na jej uruchamianie bez zatrzymywania. Jeśli usługa MDA nie została aktywowana, prawdopodobnie początkowa aktywacja była fałszywa. W takim przypadku wyłącz usługę MDA, aby uniknąć ingerencji w sesję debugowania.
Uwaga
Ta usługa MDA jest w domyślnym zestawie dla programu Visual Studio. Aby uzyskać informacje o sposobie wyłączania umów MDA, zobacz Diagnozowanie błędów przy użyciu asystentów zarządzanego debugowania.
Rozwiązanie
Postępuj zgodnie z regułami COM dotyczącymi pompowania komunikatów STA.
Wpływ na środowisko uruchomieniowe
Ta usługa MDA nie ma wpływu na CLR. Raportuje tylko dane dotyczące kontekstów COM.
Wyjście
Komunikat opisujący bieżący kontekst i kontekst docelowy.
Konfigurowanie
<mdaConfig>
<assistants>
<contextSwitchDeadlock />
</assistants>
</mdaConfig>