2011-12-07 6 views
6

이 예외가 몇 초 후에 내 응용 프로그램을 실행할 때 발생합니다. 어떤 예외 내가 CLR을 60 초 동안 COM 상황 0x648080에 COM 컨텍스트 0x647f10에서 전환 할 수 없었다이 예외를컨텍스트 스위치 교착 상태

을 처리 할 수있는 방법. 대상 컨텍스트/아파트를 소유하는 스레드는 펌핑 대기없이 수행하거나 서버 을 펌핑하지 않고 매우 오래 실행중인 작업을 처리하는 중 가장 가능성이 큽니다. 이 상황은 일반적으로 부정적인 성능 영향 을 가지며 응용 프로그램이 응답하지 않거나 시간이 지남에 따라 계속 사용량이 누적 될 수도 있습니다. 이 문제를 방지하려면 단일 스레드 아파트 (STA) 스레드는 펌핑 대기 프리미티브 (예 : CoWaitForMultipleHandles)를 사용하고 장시간 실행하는 동안 정기적으로 메시지 을 보내야합니다.

+8

모든 단어가 대문자로 된 텍스트 읽기가 성가신입니다. –

+0

어떻게 발생했는지에 대한 설명이 모두 들어 있습니다. 도움을 얻으려면 응용 프로그램의 기능과 응용 프로그램의 기능에 대해 훨씬 더 구체적으로 설명해야합니다. –

+0

나는 일반 알고리즘으로 스도쿠에서 일 해왔다. 아마도 많은 시간을 알기 위해이 예외가 발생했다. –

답변

8

일반적으로 사용자 인터페이스 스레드를 차단하고 COM 구성 요소를 사용하는 경우에 발생합니다.

여기서 가장 좋은 방법은 장기 실행 작업을 백그라운드 스레드로 옮기는 것입니다. 이로 인해 UI가 응답하게되며 COM 메시지가 올바르게 펌프 될 수 있습니다. BackgroundWorker은 이에 대한 유용한 도구입니다.

0

제 경험상이 작업은 Windows 양식의 주 스레드에서 장기 실행 작업을 수행 한 결과 발생합니다. 대신 작업을 실행하려면 BackgroundWorker을 사용하십시오. 이 작업을 수행하면 즉각적인 이점은 작업이 실행되는 동안 UI가 고정되지 않는 것입니다. ProgressChanged 이벤트를 사용하여 진행률 표시 줄을 구현할 수도 있습니다.