2011-11-12 6 views
17

저는 cs (.net 3.5 cp, vs2010)의 클래스를 사용하여 복잡한 계산을 수행하는데 시간이 많이 걸립니다. 잠시 후 ContextSwitchDeadlock이 발견 된 예외가 발생합니다. 예외가 영어 이외의 언어로 현지화 되었기 때문에 복사 붙여 넣기가 불가능하지만 다음과 같은 의미가 있습니다. ¨ CLR 모듈에서 컨텍스트 COM ... 컨텍스트 COM ... 60 초로 전환 할 수 없습니다. 대상 컨텍스트/아파트를 소유 한 하위 프로시 저는 Windows 시스템 메시지를 펌핑하지 않고 비 펌핑 대기 또는 매우 긴 실행 작업을 처리 중일 수 있습니다..NET - ContextSwitchDeadlock이 감지되었습니다.

기본적으로 내 응용 프로그램이 컴퓨팅 중이며 오랫동안 Windows에 응답하지 않아서 Visual Studio에서 시스템을 종료하고 가능한 교착 상태를보고합니다.

나는 약간 연구를 시도하고 두 가지 솔루션을 찾았습니다
  1. 이 교착 상태를 감지하는 비주얼 스튜디오 debbuger에서 일부 옵션을 비활성화합니다. Dost는 디버깅 목적으로 만 작동하기 때문에 저에게 효과적이지 않습니다.

  2. DoEvents 메서드를 호출하지만 WPF가 아닌 WPF 및 Windows 용이었고 WPF를 사용하고 있습니다.

별도의 스레드를 만드는 제안이 있었지만 스레드 스레딩을 완전히 마쳤으며 무엇을해야하는지 모릅니다. 어떤 제안을 해주시겠습니까?

답변

39

MDA (Managed Debugging Assistant)의 경고 일뿐입니다. 코드가 Single Threaded Apartment (STA) 스레드에 대한 상당히 어려운 요구 사항을 위반하고 있으며 오랜 기간 동안 차단할 수 없습니다. 경고는 실제 상황이므로 UI ​​스레드를 차단하면 쉽게 교착 상태가 발생할 수 있습니다. 그러나 당신의 경우에 대한 설명은 간단합니다. 왜냐하면 그것은 실제로 컴퓨팅이 바쁘기 때문입니다. 실제로 차단했기 때문이 아닙니다. MDA는 그 차이를 알 수 없습니다.

디버그 + 예외로 경고를 끄고 관리 디버깅 도우미 노드를 열고 ContextSwitchDeadlock을 해제 할 수 있습니다.

그래도 사용자에게는 바탕 화면에 사용자가 없어져서 세상을 망칠 수 있습니다. 멋진 사용자 환경은 아닙니다. 또한 부작용이있어 다른 프로그램이 최상위 창에 메시지를 보낼 때 응답하지 않을 수 있습니다.

정말이 문제를 해결하려면 스레딩을 사용해야합니다. BackgroundWorker를 살펴보면 MSDN Library 및 기타 여러 곳에서 잘 설명되어 있습니다.

+0

고마워요, 저는 삽니다. –