관리되는 스레딩과 관리되지 않는 스레딩

업데이트: 2007년 11월

COM 구성 요소는 아파트를 사용하여 리소스에 대한 액세스를 동기화합니다. 이와 달리 관리되는 개체는 동기화된 영역, 동기화 기본 요소(예: 뮤텍스, 잠금, 완료 포트) 및 동기화된 컨텍스트를 사용하여 모든 공유 리소스가 스레드로부터 안전한 방식으로 사용되게 합니다. .NET 스레딩 모델에 대한 자세한 내용은 관리되는 스레딩을 참조하십시오.

상호 운용성을 위해 공용 언어 런타임은 COM 개체를 호출할 때 아파트를 만들어 초기화합니다. 관리되는 스레드는 스레드를 하나만 포함하는 STA(단일 스레드 아파트) 또는 스레드를 하나 이상 포함하는 MTA(다중 스레드 아파트)를 만들어 시작할 수 있습니다. COM 아파트와 스레드 생성 아파트가 호환되는 경우 COM을 사용하여 호출 스레드에서 COM 개체를 직접 호출할 수 있습니다. 아파트가 호환되지 않는 경우 COM은 호환 가능한 아파트를 만들고 새 아파트의 프록시를 통해 모든 호출을 마샬링합니다.

런타임에서 CoInitializeEx를 호출하여 COM 아파트를 MTA 또는 STA 아파트로 초기화합니다. .NET Framework 버전 2.0에서는 관리되는 스레드를 시작하기 전에 해당 스레드의 아파트 상태를 설정하지 않은 경우 관리 스레드가 MTA로 초기화됩니다. SetApartmentState 또는 TrySetApartmentState 메서드를 사용하여 스레드를 시작하기 전에 아파트 상태를 설정합니다.

.NET Framework 버전 2.0에서는 진입점 프로시저에 STAThreadAttribute가 적용되지 않은 한 주 응용 프로그램 스레드가 MTA로 초기화됩니다.

참고:

.NET Framework 버전 1.0 및 1.1에서는 스레드가 실행된 후에도 System.Threading.ApartmentState 속성을 사용하여 아파트 상태를 설정할 수 있었기 때문에 경합 상태가 발생했습니다. .NET Framework 버전 2.0에서는 이를 수행할 수 없습니다.

일부 프로그래밍 모델에서는 스레드에 STA 속성을 설정해야 합니다. 예를 들어, 끌어서 놓기 같은 요소를 초기화하는 Windows Forms의 경우 단일 스레드 아파트를 만들어서 입력해야 합니다.

참고:

프록시와 스텁 또는 형식 라이브러리가 등록되어 있지 않으면 관리 코드에서 COM 개체를 호출할 때 InvalidCastException이 발생할 수 있습니다.

다음 표에서는 ApartmentState 열거형 값을 나열하고 해당하는 COM 아파트 초기화 호출을 알려 줍니다.

ApartmentState 열거형 값

COM 아파트 초기화

MTA

CoInitializeEx(NULL, COINIT_MULTITHREADED)

STA

CoIntializeEx(NULL, COINIT_APARTMENTTHREADED)

알 수 없음

CoInitializeEx(NULL, COINIT_MULTITHREADED)

COM 개체와 관리되는 스레드가 호환되지 않는 아파트에 있는 경우 해당 개체에서는 COM에서 만든 프록시를 통해 모든 호출이 이루어집니다.

참고 항목

개념

.NET Framework에 COM 구성 요소 노출

.NET Framework 구성 요소를 COM에 노출

기타 리소스

고급 수준의 COM 상호 운용성