문제

저는 레거시 COM 구성 요소를 가지고 있으며, 제 임무는 COM을 래핑하고 동시 비차단 호출을 활성화하는 웹 서비스를 작성하는 것입니다.

우선, COM 개체 자체는 상태 비저장(stateless)이기 때문에 각 스레드가 lock { } 문 사용을 방지하고 실제 동시 처리를 가능하게 하기 위해 COM 개체의 자체 인스턴스를 갖도록 [ThreadStatic] 특성을 사용하기로 결정했습니다. 모든 호출이 여전히 동기식으로 진행되는 것 같습니다.

for { } 루프와 동기식으로 COM 구성 요소에서 메서드를 실행하는 테스트 코드를 작성한 다음 정확히 동일하지만 COM 개체의 다른 인스턴스에 수행하는 두 번째 스레드를 추가했는데 변경 사항이 없습니다. X 호출은 항상 Y를 사용합니다. 스레드 수에 관계없이 시간 범위.정적 잠금 장치 같은 것이 있는 것 같습니다.

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

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

도움이 되었습니까?

해결책

COM은 스레딩을 인식하며 coclass에서 요청한 스레딩 모델을 따릅니다.레지스트리의 ThreadingModel 값을 사용하여 스레딩 요구 사항을 게시합니다."아파트"로 설정되거나 누락된 경우 COM은 QI 인터페이스에 대한 프록시를 반환하여 단일 스레드 아파트에서 모든 메서드 호출이 이루어지도록 합니다.프록시는 호출이 올바른 스레드로 마샬링되는지 확인합니다.

STA 스레드에서 coclass를 생성할 때 얻은 인터페이스 포인터를 속여서 사용하고 마샬링 없이 호출할 수 있습니다.coclass가 이미 멀티스레딩을 지원하지 않는다고 말한 것을 고려하면 이것이 올바르게 작동할 가능성은 거의 없습니다.내부 상태를 무작위로 손상시킬 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top