비주얼 스튜디어에서 프로젝트를 개발하는 과정 중이나 개발을 완료한 다음 빌드를 하고 [디버깅 시작]으로 실행을 해 보게 됩니다. 일반적인 구문상의 오류는 없지만 하나의 프로세스가 60초 이상 계속 실행이 지속되면 자동으로 ContextSwitchDeadlock이 걸려 실행 프로그램이 강제 종료되게 됩니다.
프로그램 구문을 잘못 작성해서 무한루프에 빠지는 경우 ContextSwitchDeadlock으로 실행 중인 프로그램을 강제 종료시킬 수 있습니다.
하지만 프로그램의 성격에 따라 실제로 실행 시간이 실제로 60초를 초과하는 경우가 생길 수도 있습니다. 따라서 ContextSwitchDeadlock이 걸리지 않도록 예외 설정을 해 줄 필요가 있습니다.
아래 화면과 같이 실행 시간 초과에 따른 강제 종료를 막기 위한 예외 설정을 해 보도록 하겠습니다.
<< 에러내용 1>>
관리 디버깅 도우미 ‘ContextSwitchDeadlock’ : CLR에서 60초 동안 COM 컨텍스트 0x1a18b8에서 COM 컨텍스트 0x1a1a28(으)로 전환하지 못했습니다.
대상 컨텍스트/아파트를 소유하는 스레드가 펌프 대기를 수행하지 않거나, Windows 메시지를 펌프하지 않고 매우 긴 실행 작업을 처리하고 있는 것 같습니다.
이러한 상황은 대개 성능에 부정적인 영향을 주며 응용 프로그램이 응답하지 않거나 시간이 흐름에 따라 메모리 사용이 증가하는 문제로 이어질 수도 있습니다.
<<에러 내용 2>>
System.Data.SqlClient.SqlException: ‘실행 제한 시간을 초과했습니다. 작업이 완료되기 전에 실행 제한 시간이 지났거나 서버가 응답하지 않습니다.’
Win32Exception: 대기 작동이 시간 초과되었습니다
이 문제를 방지하려면 모든 STA(Single Threaded Apartment) 스레드가 펌프 대기 기본 형식(예: CoWaitForMultipleHandles)을 사용하고 긴 실행 작업 동안 지속적으로 메시지를 펌프해야 합니다
Visual Studio 2019에서의 예외 설정 – ContextSwitchDeadlock
▼ 아래에 보이는 화면처럼 비주얼스튜디오 메뉴의 [디버그]에 있는 [창]에서 [예외 설정]을 클릭해서 예외 설정 창을 엽니다.
– 디버그 > 창 > 예외 설정
▼ 예외 설정 창에서 [Managed Debugging Assistants] > [ContextSwitchDeadlock]의 체크를 해제합니다.
Visual Studio 2015에서의 예외 설정 – ContextSwitchDeadlock
▼ 비주얼스튜디오 2015는 아래 화면을 참고하세요.
– 디버그 > 창 > 예외 설정 > [ContextSwitchDeadlock] 체크 해제
※ 함께 읽으면 도움이 될 만한 다른 포스팅 글입니다.
이 글이 도움이 되었기를 바랍니다. ^-^