2009-09-08

ContextSwitchDeadlock 에러의 해결

참고 : http://social.msdn.microsoft.com/Forums/en-US/vsto/thread/8630a1bb-fc65-49e5-8b37-bf77378e380f

그동안 많은 텍스트 데이터 조작을 통해서 작업을 하다 보니 CPU나 메모리 자원이 부족한 경우가 많았다.
특히 개발 초기에는 개체를 해제하는 Close() 명령을 아예 모르다 보니 무한정 자원을 붙잡고 있는 경우도 있었고
형태소 분석기의 자료처리 한계 도달 등 한정적인 상황에 대한 대처만 해 왔던 터라 이해가 부족한 것도 사실이었다.

이번에는 프로그램 전반에서 텍스트 데이터를 광범위하게 사용하고 있으며, 분석 과정에 시간이 많이 소요되는
웹 자료 가져오기 (HttpWebRequest / Response)도 자주 사용하다 보니 같은 문제에 직면하게 되었다.
그동안 임시방편으로 사용하던 Application.Doevents()와 같은 Message Pump 해결방법으로는 무리가 되었다.
결국은 에러 메시지를 기반으로 ContextSwitchDeadlock 문제의 근본적인 해결을 추구하는 게 좋을 것 같았다.

기본적으로 Deadlock이 자원공유 위반으로부터 야기된다는 것을 초급교재에서 보아서 알고 있었고
프로그래밍시에 이 부분은 기본적으로 회피하면서 작업을 해 왔기에 (이름을 다르게 하는 등) 더욱 혼동이 되었는데
오늘 비로소 문제를 해결한 것 같다.

참고 자료의 해석에 따르면, CLR을 COM 기반으로 해석하는 가운데 해당 에러의 우려가 감지되는 경우 리턴되는 메시지로,
크게 위험성은 없는 것이라고 한다.
물론 실시간 시스템 등 연구 목적이 아닌 경우는 응답이 무한정 길어질 염려는 있는 것으로 보이지만
내게는 그저 불편할 뿐이니...
해결 방법으로 가장 간단하게 제시된 것은 VS Debugger에서 해당 에러 메시지의 리턴을 안 하게
옵션을 해제하는 방법이다.
메뉴바의 Debug - Exceptions - Managed Debugging Assistants 항목에서 ContextSwitchDeadlock 체크를 지우는
아주 간단한 작업만으로 이 문제가 해결되는 것으로 보인다.
지금 보다 큰 작업으로 테스트를 하고 있는데 잘 작동이 되는 것으로 생각되고 있다.

하지만 앞에서 말한 대로 단점도 분명히 존재하는 경우이니 옵션에 대한 지식은 필수일 것으로 생각된다.

No comments:

Post a Comment