Otrzymuję komunikat o błędzie, którego nie mogę rozwiązać. Pochodzi z programu Visual Studio lub debugera. Nie jestem pewien, czy ostateczny stan błędu występuje w VS, debugerze, moim programie czy bazie danych.
To jest aplikacja dla systemu Windows. To nie jest aplikacja internetowa.
Pierwsza wiadomość od VS to wyskakujące okienko z informacją: „Żadne symbole nie są ładowane dla żadnej ramki stosu wywołań. Nie można wyświetlić kodu źródłowego”. Po kliknięciu otrzymuję komunikat: „ Wykryto ContextSwitchDeadlock ” wraz z długim komunikatem przedstawionym poniżej.
Błąd pojawia się w pętli, która skanuje w dół DataTable. Dla każdego wiersza używa wartości klucza (HIC #) z tabeli jako parametru dla SqlCommand. Polecenie służy do tworzenia SqlDataReader, który zwraca jeden wiersz. Dane są porównywane. W przypadku wykrycia błędu wiersz jest dodawany do drugiego DataTable.
Wydaje się, że błąd jest związany z tym, jak długo trwa procedura (tj. Po 60 sekundach), a nie z liczbą znalezionych błędów. Nie sądzę, żeby to był problem z pamięcią. W pętli nie są deklarowane żadne zmienne. Jedynymi obiektami, które są tworzone, są SqlDataReaders i są one w użyciu struktur. Dodanie System.GC.Collect () nie przyniosło żadnego efektu.
Baza danych to witryna SqlServer na tym samym laptopie.
W formularzu nie ma żadnych fantazyjnych gadżetów ani gadżetów.
Nie jestem świadomy niczego w tym procie, co znacznie różni się od tego, co robiłem dziesiątki razy wcześniej. Widziałem ten błąd wcześniej, ale nigdy w sposób spójny.
Jakieś pomysły, ktoś?
Pełny tekst błędu: CLR nie może przejść z kontekstu COM 0x1a0b88 do kontekstu COM 0x1a0cf8 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 ogólnie ma 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.