지금까지 게시 한 댓글과 답변에는 상당한 혼란이 있습니다. STA 또는 MTA는 스레드의 속성입니다. 그러나 중요한 것은 COM 구성 요소에 필요한 것입니다. ThreadingModel 레지스트리 값에 선언되어 있습니다. 매우 일반적인 환경 인 "Apartment"를 발견했습니다. 구성 요소가 스레딩을 지원하지 않는다는 의미입니다.
.NET Framework의 대부분의 클래스와 달리 스레드 안전성은 거의 없습니다. 큰 차이점은 COM 은 스레딩 안전성이입니다. .NET 클래스를 사용하면 코드를 작성하여 클래스 객체를 스레드로부터 안전하게 사용할 수 있습니다. 어려운 일이 아니며 만성적으로 버그를 진단 할 수있는 만성적 인 소스가 있지만 잘 설계된 잠금을 사용하면 제한 사항을 해결할 수 있습니다. COM에서는 그럴 수 없으며, 항상 도움이되지 않으면 스레드 안전성을 제공합니다. 당신이 도와주고 싶어도.
앞서가는 유일한 방법은 하나의 스레드에서만 COM 구성 요소를 만들고 사용하는 것입니다. 이 스레드는 STA를 선택하기 위해 Thread.SetApartmentState()로 초기화되어야합니다. COM에 대해 구성 요소에 대한 안전한 피난처를 찾기 위해 자체 스레드를 만들지 못하게합니다. 그리고 STA 요구 사항 인 메시지 루프를 펌프해야합니다. 다른 스레드에서 COM 구성 요소를 사용하려고하지 않고 구성 요소 자체가 메시지 펌프를 사용할 수 있는지 여부에 의존하지 않는 경우 고통 스럽거나 일 수 있습니다.은 피해야합니다. 어느 것이 꽤 일반적인 btw입니다. 반응이 없어지면 예상되는 이벤트가 발생하지 않는 것을 알 수 있습니다. 같은 스레드의 COM 개체에 대한 호출 만 수행하여 자체 개체를 만드는 다른 스레드와의 동시성을 확보하십시오. 이것은 일반적으로 유용하거나 가능하지 않습니다.
COM 구성 요소가 STA (Single Threaded Apartment) 또는 MTA (Multi Threaded Apartment)로 선언 되었습니까? – Seb
어떻게 확인합니까? – EagerToLearn
@EagerToLearn 참조하십시오 http://stackoverflow.com/questions/2722867/how-to-determine-threading-model-of-given-com-library – shf301