2011-11-12 11 views
17

Mam klasę w C# (.net 3.5 cp, vs2010), która wykonuje skomplikowane komplikacje, które zwykle zajmuje dużo czasu. Po minucie zostanie zgłoszony wyjątek, który wykrył ContextSwitchDeadlock. Wyjątek jest zlokalizowany do mojego nieangielskiego języka, więc nie mogę skopiować wklej, ale znaczenie jest następujące: ¨ Moduł CLR nie może przejść z kontekstu COM ... do kontekstu COM ... przez 60 sekund. Podprocesy, do których należy kontekst docelowy/apartament, prawdopodobnie wykonują niepotrzebne oczekiwanie lub przetwarzają bardzo długą operację bez pompowania komunikatów systemu Windows..NET - Wykryto ContextSwitchDeadlock

Wygląda na to, że moja aplikacja oblicza się i nie reaguje na okna przez długi czas, a studio graficzne wyłącza ją i zgłasza możliwe zakleszczenie.

starałem się zrobić kilka badań i znaleźć dwa rozwiązania:

  1. wyłączyć niektóre opcje w Visual Studio debbuger wykrywania zakleszczenia. Nie działa dla mnie, ponieważ jest to jedyne narzędzie do debugowania.

  2. Zadzwoń do jakiejś metody DoEvents, ale dotyczyła ona formularzy Windows, a nie WPF i używam WPF.

Było też propozycja, aby utworzyć oddzielny wątek, ale jestem całkowicie nowy do gwintowania i nie wiem co mam zrobić. Wszelkie sugestie proszę?

Odpowiedz

39

To tylko ostrzeżenie od Managed Debugging Assistant (MDA). Twój kod narusza dość trudne wymagania dla wątków z pojedynczym wątkiem (STA), nie mogą blokować przez dłuższy czas. Ostrzeżenie jest wystarczająco prawdziwe, zablokowanie wątku UI może łatwo spowodować zakleszczenie. Ale wyjaśnienie w twoim przypadku jest proste, po prostu jest katatoniczne, ponieważ jest pracowite, a nie dlatego, że zostało zablokowane. MDA nie może odróżnić.

Możesz wyłączyć ostrzeżenie za pomocą opcji Debug + Wyjątki, otwórz węzeł Asystenci do zarządzania debugowaniem i usuń ContextSwitchDeadlock.

To nadal pozostawia użytkownikowi okno na swoim pulpicie, które nie działa w świecie, a nie jest to doskonałe narzędzie dla użytkowników. Może mieć również skutki uboczne, powodując, że inne programy przestają odpowiadać, gdy wysyłają wiadomości do głównych okien.

Musisz użyć wątków, aby naprawdę rozwiązać ten problem. Spójrz na BackgroundWorker, jest dobrze udokumentowany w bibliotece MSDN i wielu innych miejscach.

+0

Dziękuję, spróbuję backgroundworker. –

Powiązane problemy