Uruchamiam aplikację C # i podczas wykonywania otrzymuję następujący błąd:
Środowisko CLR nie mogło przejść z kontekstu COM 0x20e480 do kontekstu COM 0x20e5f0 przez 60 sekund. Wątek będący właścicielem kontekstu / apartamentu docelowego najprawdopodobniej albo wykonuje oczekiwanie bez pompowania, albo przetwarza bardzo długotrwałą operację bez pompowania komunikatów systemu Windows. Ta sytuacja ma ogólnie negatywny wpływ na wydajność i może nawet prowadzić do braku odpowiedzi aplikacji lub ciągłego zwiększania się zużycia pamięci. Aby uniknąć tego problemu, wszystkie wątki z pojedynczym wątkiem (STA) powinny używać elementów podstawowych oczekiwania pompowania (takich jak CoWaitForMultipleHandles) i rutynowo pompować komunikaty podczas długotrwałych operacji.
Czy ktoś może mi pomóc w rozwiązaniu problemu?
Wielkie dzięki.
źródło
Aby dowiedzieć się, która operacja blokuje przełącznik kontekstu i powoduje wyświetlenie MDA contextSwitchDeadlock , możesz wykonać następujące czynności. Zwróć uwagę, że będę odnosić się do Visual Studio 2012.
Zakładając, że zdecydujesz się nie przenosić operacji wymagającej dużej ilości zasobów z głównego wątku - zanim to zrobisz, zapoznaj się z niektórymi innymi odpowiedziami i komentarzami - masz następujące opcje wyłączania asystentów zarządzanego debugowania.
W programie Visual Studio Debugger
Poza debugerem programu Visual Studio
Uwaga: Jedna z pierwszych dwóch opcji musi być ustawiona na 1, aby trzecia miała jakikolwiek efekt.
W moim przypadku problemem było wywołanie ObjectContext.SaveChanges () w Entity Framework w aplikacji konsoli. Po zastosowaniu MTAThreadAttribute do
Main()
metody wyjątek ContextSwitchDeadlock nie był już zgłaszany . Niestety, nie jestem pewien, jakie będą skutki tej zmiany.źródło
Ten komunikat wskazuje, że jakiś Twój kod próbuje przełączyć wątki, a wątek docelowy jest zajęty. Na przykład wątek w tle, który próbuje wysłać wywołanie do wątku interfejsu użytkownika, aby zaktualizować interfejs użytkownika, podczas gdy interfejs użytkownika przez pewien czas wykonuje ciasną pętlę.
Aby dowiedzieć się, co się dzieje, musisz włamać się do debugera i przyjrzeć się wszystkim wątkom i tym, co robią.
źródło
W niektórych przypadkach:
Debug -> Wyjątki -> Managed Debug Assistants
i odznaczenie elementu ContextSwitchDeadlock.
źródło
Po prostu wybierz Wyjątki z menu Debug w oknie programu Visual Studio 2005, pojawi się okno dialogowe Edxception, wybierz węzeł wyjątku Managed Debugging Assistants, a następnie wybierz ContextSwitchDeadlock i usuń zaznaczenie z kolumny Thrown. spowoduje to, że vs nie zgłosi wyjątku ContextSwitchDeadlock.
Mam nadzieję że to pomoże..
źródło
Napotkałem ten problem, próbując dowiedzieć się, dlaczego
OracleDataReader
rzucam wyjątek. Myślałem, że dzieje się tak, ponieważ został przypisany,null
ponieważ wyjątek był powiązany z parametrem o wartości `null. Więc zrobiłem:while (dr.Read()) { while (dr != null) // <-- added this line { ...
Okazało się, że
dr
NIGDY nie było null, więc pętla po prostu trwała i trwała, dopóki nie nadeszła ta wiadomość, i dalej i dalej, ponieważ możesz kliknąć „Kontynuuj”, aby kontynuować, dopóki nie zabraknie pamięci (nie rób tego - kliknij „OK”). Więc morał tej historii, szukaj wycieków pamięci, które przesyłają dane z bazy danych do pamięci w pętli do nieskończoności. Błąd faktycznie próbuje ostrzec Cię przed złym scenariuszem. Najlepiej to zważać.źródło
Ten błąd pojawiał się u mnie wiele razy i wyśledziłem go do iteracji w
DataGridViewRow
, w której ustawiłem wartość pola wyboru na true. Ponieważ pracowałem w trybie debugowania, miałem możliwość kontynuowania, więc mogłem to zrobić.Mam nadzieję, że to komuś pomoże.
źródło
Zakładając, że używasz programu Visual Studio, możesz kliknąć
Ctrl+Alt+E
w bieżącym projekcie, a okno wyjątków zostanie wyświetlone z wybranymi asystentami zarządzanego debugowania, należy odznaczyć opcję „ContextSwitchDeadlock”. następnie zbuduj bieżący projekt.źródło