[C#] Visual Studio : ContextSwitchDeadlock

확인할 수없는 오류 메시지가 나타납니다. Visual Studio 또는 디버거에서 시작됩니다. 궁극적 인 오류 조건이 VS, 디버거, 내 프로그램 또는 데이터베이스인지 확실하지 않습니다.

이것은 Windows 앱입니다. 웹앱이 아닙니다.

VS의 첫 번째 메시지는 “콜 스택 프레임에로드 된 심볼이 없습니다. 소스 코드를 표시 할 수 없습니다.”라는 팝업 상자입니다. 클릭하면 ” ContextSwitchDeadlock이 감지되었습니다 “라는 메시지와 함께 아래에 긴 메시지가 표시됩니다.

DataTable을 스캔하는 루프에서 오류가 발생합니다. 각 줄에 대해 테이블의 키 (HIC #) 값을 SqlCommand의 매개 변수로 사용합니다. 이 명령은 한 줄을 반환하는 SqlDataReader를 만드는 데 사용됩니다. 데이터가 비교됩니다. 오류가 감지되면 행이 두 번째 DataTable에 추가됩니다.

오류는 발견 된 오류 수가 아니라 프로 시저 실행 시간 (60 초 후)과 관련이있는 것 같습니다. 메모리 문제라고 생각하지 않습니다. 루프 내에서 변수가 선언되지 않았습니다. 만들어진 유일한 개체는 SqlDataReaders이며, 사용중인 구조에 있습니다. System.GC.Collect () 추가는 효과가 없습니다.

db는 동일한 랩톱에있는 SqlServer 사이트입니다.

양식에 멋진 기즈모 또는 가젯이 없습니다.

나는이 과정에서 내가 수십 번했던 것과 크게 다른 것을 알지 못한다. 나는 이전에 오류를 보았지만 일관된 기준으로 보지 못했습니다.

어떤 아이디어라도?

전체 오류 텍스트 :
CLR이 60 초 동안 COM 컨텍스트 0x1a0b88에서 COM 컨텍스트 0x1a0cf8로 전환 할 수 없습니다. 대상 컨텍스트 / 아파트를 소유 한 스레드는 비 펌핑 대기를 수행하거나 Windows 메시지를 펌핑하지 않고 매우 오래 실행되는 작업을 처리 할 가능성이 높습니다. 이러한 상황은 일반적으로 성능에 부정적인 영향을 미치며 응용 프로그램이 응답하지 않거나 시간이 지남에 따라 메모리 사용량이 지속적으로 누적 될 수 있습니다. 이 문제를 방지하려면 모든 단일 스레드 아파트 (STA) 스레드는 펌핑 대기 프리미티브 (예 : CoWaitForMultipleHandles)를 사용하고 장기간 실행되는 동안 정기적으로 메시지를 펌핑해야합니다.



답변

ContextSwitchDeadlock반드시 코드에 문제가 있음을 의미 하는 것은 아니며 가능성이 있다는 것입니다. 당신이 가면 Debug > Exceptions메뉴에와 확장 Managed Debugging Assistants, 당신은 발견 할 것이다 ContextSwitchDeadlock사용할 수 있습니다. 이 기능을 비활성화하면 항목을 처리하는 데 시간이 오래 걸리는 경우 VS가 더 이상 경고하지 않습니다. 경우에 따라 장기 실행 작업이 유효 할 수 있습니다. 또한 디버깅 중이며 처리가 진행되는 동안 중단 된 경우에도 유용합니다. 문제를 파헤 치기 전에 불만을 제기하지 않기를 바랍니다.


답변

Pedro가 말했듯이 코드를 단계별로 실행하는 경우 디버거에 문제가있어 메시지 펌프가 차단됩니다.

그러나 UI 스레드에서 장기 실행 작업을 수행하는 경우 Application.DoEvents ()를 호출하여 메시지 큐를 명시 적으로 펌핑 한 다음 현재 메소드에 제어를 리턴합니다.

그러나이 작업을 수행하는 경우 UI 스레드에서 처리를 수행하여 UI를 멋지게 유지할 수 있도록 디자인을 보는 것이 좋습니다.


답변

앱의 기본 UI 스레드 에서이 작업을 수행하는 것처럼 들립니다. UI 스레드는 도착시 Windows 메시지를 펌핑하는 역할을 담당하지만 데이터베이스 호출에서 차단되었으므로 그렇게 할 수 없습니다. 시스템 전체 메시지에 문제가 발생할 수 있습니다.

장기 실행 작업을위한 백그라운드 스레드를 생성하고 발생하는 동안 사용자에게 “I ‘m busy”대화 상자를 표시하는 것을 살펴 봐야합니다.


답변

Visual Studio 2017에서 다음을 통해 ContextSwitchDeadlock 옵션을 선택 취소했습니다.

디버그> Windows> 예외 설정

여기에 이미지 설명을 입력하십시오

예외 설정 Windows에서 : ContextSwitchDeadlock 옵션을 선택 취소하십시오.

여기에 이미지 설명을 입력하십시오


답변

이 예외를 비활성화하지 않으려면 60 초마다 적어도 한 번은 응용 프로그램에서 일부 메시지를 펌핑하기 만하면됩니다. 이 예외가 발생하지 않도록합니다. 때때로 System.Threading.Thread.CurrentThread.Join (10)을 호출하십시오. 메시지를 펌핑 할 수있는 다른 호출이 있습니다.


답변

위의 솔루션은 일부 시나리오에서는 좋지만 단위 테스트 중이고 솔루션이 디버그로 설정되지 않은 경우 테스트 탐색기에서 “선택한 테스트 디버그”를 시도 할 때 이런 상황이 발생합니다.

이 경우 릴리스에서 솔루션을 변경하거나이 경우 디버그로 설정 한 모든 것을 변경해야합니다. 이것이 문제라면 “ContextSwitchDeadlock”을 변경해도 실제로 도움이되지 않습니다.

오류 메시지가 너무 불쾌했기 때문에 이것을 직접보고 싶었습니다. 디버그 설정 인 명백한 사항을 확인하지 않았습니다!


답변

Visual Studio 2017 스페인어 버전

“Depurar”-> “Ventanas”-> “Configuración de Excepciones”

“ContextSwitchDeadlock”을 검색하십시오. 그런 다음 선택을 취소하십시오. 또는 바로 가기

Ctrl + D, E

베스트.