2010-01-12 11 views
6

Mam aplikację GUI, która łączy się z czujnikiem, zbiera dane i przetwarza je w tle za pomocą wątków BackgroundWorker.Jak zdebugować i rozwiązać awarię "DisconnectedContext"?

W tej formie publikuję dane do GUI, używając ProgressChanged, która wydawała się działać dobrze. Od tego czasu podniosłem szybkość transmisji danych i odkryłem problem; jeśli oprogramowanie pozostanie uruchomione przez kilka minut, ilość użycia procesora wydaje się wzrastać, aż osiągnie prawie 100% na obu rdzeniach na moim komputerze i w tym momencie pojawia się błąd, który brzmi:

Managed Debugging Assistant "DisconnectedContext" wykrył problem w "myapp.exe". Informacje dodatkowe: Kontekst 0xe2ba0 jest rozłączony. Zwalnianie interfejsów z bieżącego kontekstu (kontekst 0xe2d10). Może to spowodować uszkodzenie lub utratę danych.

Przeczytałem kilka rzeczy w Internecie, które sugerują, że może się to zdarzyć, jeśli aplikacja GUI nie jest w stanie wystarczająco pompować wiadomości. Zauważyłem, że mogę sprowokować tę samą awarię, by zdarzyć się szybciej, jeśli szybko zmieniam rozmiar okna (tj. Pompuję ładunek więcej komunikatów), który wspiera teorię, o której myślę?

więc o pytania są:

  1. czy ktoś zgadza się z moją hipotezą o wiadomość pompowania?
  2. Czy istnieje inne wytłumaczenie?
  3. Czy jest jakiś sposób, mogę to udowodnić (zerknąć na liczbę wiadomości w kolejce)?
  4. Czy wszystkie te złe zapachy kodu sugerują, że podchodzę do tego w niewłaściwy sposób?

Każda rada byłaby bardzo wdzięcznie przyjęta.

Odpowiedz

3

Ten rodzaj dźwięków jest bardzo specyficznym problemem i myślę, że właśnie dlatego nikt jeszcze nie odpowiedział, ale myślę, że mogę pomóc na pytanie nr 3.

Spy++ powinien być w stanie zobaczyć wiadomości przychodzące do twojego okna. Myślę, że można go użyć do oglądania wiadomości pompowanych do GUI i wykonywania testu zmiany rozmiaru. Jeśli zauważysz duży wzrost liczby wiadomości próbujących zostać przetworzone, może to potwierdzić twoją hipotezę.

Na marginesie, przeczytałem, że możesz zmienić główny wątek mieszkania z STAThread na MTAThread, aby ten MDA zniknął.

Perfapy można zmodyfikować aplikację pluć odczyty czujnika do pliku lub kolejki je w inny mechanizm, zamiast aktualizować GUI stale. HTH.

+1

Próbowałem ustawienia MTATHread, które zdawało się tylko powodować sporadyczne awarie. Zamiast tego przyjąłem mechanizm queuenig i zgłosiłem błąd w części kodu wyświetlacza, który był nadpełny w "RichTextBoxControl". Pomiędzy tymi dwoma wygląda na to, że rozwiązałem problem. Dzięki za sugestie. –

+0

Widziałem to już kilka razy i na pewno zostało wywołane przez próbę wysłania zbyt wielu żądań 'ProgressChanged' od wątku producenta danych do jego odbiorców. –

Powiązane problemy