2009-11-28 2 views
3

레거시 COM 구성 요소가 있습니다. 내 임무는 COM을 래핑하고 동시에 논 블로킹 호출을 사용할 수있는 웹 서비스를 작성하는 것입니다.C# 멀티 스레드 환경에서 레거시 COM 구성 요소 사용

우선, COM 개체 자체가 상태가 없기 때문에 [ThreadStatic] 특성을 사용하기로 결정 했으므로 각 스레드는 COM 개체를 사용하여 lock {} 문을 사용하지 못하도록 방지하고 실제 동시 사용을 허용합니다 처리하지만 모든 호출이 여전히 동기식으로 처리 된 것처럼 보입니다.

{} 루프에 대한 동기 COM 구성 요소에서 메서드를 실행하는 테스트 코드를 작성한 다음 똑같이하지만 COM 개체의 다른 인스턴스에 두 번째 스레드를 추가했는데 변경 사항이 없습니다. X 호출은 항상 스레드 수에 관계없이 Y 시간 간격을 소비합니다. 거기에 정적 잠금 장치가있는 것처럼 ...

그럼에도 불구하고 별도의 프로세스가 각 호출을 동시에 처리 할 수 ​​있습니다. 별도의 스레드가 동일한 동작을하지 못하게하는 요인은 무엇입니까?

COM 구성 요소에 대한 실제 동시 호출을 활성화하려면 어떻게해야합니까?

답변

3

COM은 스레딩을 인식하고 코 클라스가 요청한 스레딩 모델을 기립니다. 스레딩 요구 사항을 ThreadingModel 값과 함께 레지스트리에 게시합니다. "Apartment"로 설정된 경우 (또는 누락 된 경우) COM은 QI 인터페이스에 대한 프록시를 반환하여 단일 스레드 아파트에서 모든 메서드 호출을 수행하는지 확인합니다. 프록시는 호출이 올바른 스레드로 마샬링되도록합니다.

STA 스레드에서 coclass를 만들 때 얻은 인터페이스 포인터를 속여서 사용할 수 있으며 마샬링없이 호출 할 수 있습니다. coclass가 멀티 스레딩을 할 수 없다고 이미 말했을 경우, 이것은 올바르게 작동하지 않을 것입니다. 내부 상태가 무작위로 손상됩니다.

관련 문제