contextSwitchDeadlock MDA
COM 컨텍스트 전환을 시도하는 중 교착 상태가 감지되면 contextSwitchDeadlock MDA(관리 디버깅 도우미)가 활성화됩니다.
증상
가장 일반적인 증상은 관리 코드에서 비관리 COM 구성 요소에 대한 호출이 반환되지 않는 것입니다. 그 밖에 시간이 지남에 따라 메모리 사용량이 증가하는 증상도 있습니다.
원인
가장 가능성이 높은 원인으로는 STA(단일 스레드 아파트)가 메시지를 펌프하지 않는 것입니다. STA 스레드는 메시지를 펌프하지 않고 대기하거나 오래 걸리는 작업을 수행하며 메시지 큐에서 펌프하도록 허용하지 않습니다.
시간이 지남에 따라 메모리 사용량이 증가하는 것은 비관리 COM 구성 요소에서 Release를 호출하려는 종료자 스레드의 시도에 따라 발생하는 것으로 해당 구성 요소는 반환되지 않습니다. 따라서 종료자는 다른 개체를 회수하지 못하게 됩니다.
기본적으로 Visual Basic 콘솔 응용 프로그램의 주 스레드에 대한 스레딩 모델은 STA입니다. STA 스레드가 직접 또는 공용 언어 런타임이나 타사 컨트롤을 통해 간접적으로 COM 상호 운용성을 사용할 경우 이 MDA가 활성화됩니다. Visual Basic 콘솔 응용 프로그램에서 이 MDA가 활성화되지 않도록 하려면 MTAThreadAttribute 특성을 주 메서드에 적용하거나 메시지를 펌프하도록 응용 프로그램을 수정합니다.
다음 조건이 모두 충족되면 이 DMA가 잘못 활성화될 수 있습니다.
용용 프로그램이 STA 스레드에서 직접 또는 라이브러리를 통해 간접적으로 COM 구성 요소를 만드는 경우
응용 프로그램이 디버거에서 중지되었고 사용자가 응용 프로그램을 계속했거나 단계 작업을 수행한 경우
관리되지 않는 디버깅이 활성화되지 않은 경우
MDA가 잘못 활성화되었는지 여부를 확인하려면 모든 중단점을 비활성화하고 응용 프로그램을 다시 시작한 다음 응용 프로그램이 중지하지 않고 실행될 수 있도록 합니다. MDA가 활성화되지 않았으면 초기 활성화가 잘못된 것일 수 있습니다. 이 경우 MDA를 비활성화하여 디버깅 세션과의 충돌을 피합니다.
참고 |
---|
이 MDA는 Visual Studio 2005 및 이후 버전의 기본 집합입니다.Visual Studio에서 호스팅 프로세스가 활성화된 경우 기본 집합에 있는 MDA를 비활성화할 수 없습니다.호스팅 프로세스는 기본적으로 사용되기 때문에 해당 프로세스를 명시적으로 사용하지 않도록 설정해야 합니다.MDA를 비활성화하는 방법에 대한 자세한 내용은 관리 디버깅 도우미를 사용하여 오류 진단에서 "MDA 사용 및 사용 안 함"을 참조하십시오. |
해결 방법
STA 메시지 펌프에 대한 COM 규칙을 따릅니다.
런타임 효과
이 MDA는 CLR에 아무런 영향을 주지 않습니다. COM 컨텍스트에 대한 데이터만 보고합니다.
Output
현재 컨텍스트와 대상 컨텍스트를 설명하는 메시지입니다.
구성
<mdaConfig>
<assistants>
<contextSwitchDeadlock enable="false" />
</assistants>
</mdaConfig>