문제

에 따르면 이 기사 COM 객체를 "둘 다"또는 "무료"스레딩 모델로 등록하면 해당 객체는 완전히 스레드 안전이어야합니다. 특히 글로벌 공유 변수에 대한 모든 액세스는 동기화되어야하며 멤버 변수에 대한 모든 액세스도 동기화되어야합니다. 그것은 많은 노력입니다.

이제 "무료"스레딩 모델을 사용하는 것으로 등록 할 수 있다는 것은 유리하며 완전히 스레드 안전을 위해 비용을 지불하는 것이 좋습니다. 그러나 왜“두 스레딩 모델을 사용하여 내 객체를 등록하고 싶습니까? 이점은 무엇입니까? "둘 다"와 "무료"를 어떻게 선택합니까?

도움이 되었습니까?

해결책

두 스레딩 모델

구성 요소를 스레딩 모델 "둘 다"로 표시하는 주된 이유는 구성 요소가 단일 스레드 아파트 (STA)에서 호출 될 때 성능 향상 때문입니다.

구성 요소를 MTA로 표시하고 구성 요소가 STA 내에서 생성되면 별도의 MTA 아파트에서 구성 요소가 생성됩니다. "결과적으로 apartment 마샬링은 효율적이고 자유로운 스레드 구성 요소를 만들기 위해 모든 작업을 무효화 할 수있을 정도로 성능을 저하시킬 수 있습니다.". 그러나 구성 요소의 스레딩 모델이 "둘 다"로 표시되면 STA 객체의 아파트 내부에서 생성되어 직접 액세스 할 수 있습니다.

따라서 구성 요소가 STA 내에서 호출 될 수 있다고 생각되면 (모든 VB6 COM 객체는 STA) 스레딩 모델을 "둘 다"로 표시 할 수 있습니다.

좋은 KB 기사 올레 스레딩 모델.

무료 스레딩 모델

구성 요소가 "무료"로 표시된 다른 구성 요소를 사용하는 경우 "무료"스레드 모델을 사용하려고 할 수 있습니다. 구성 요소가 "둘 다"로 표시되면 STA와 MTA에서 실행되는 "둘 다"구성 요소 사이에 과도한 아파트가 전환 될 수 있습니다. 일반적으로 모든 시나리오에서 제대로 작동하면서 가능한 한 발신자에 가깝게 구성 요소를 작성하십시오 (즉, 동일한 아파트).

구성 요소를 "무료"로 표시하는 또 다른 상황은 명시 적으로 차단되는 경우 (예 : Thread.sleep)입니다. 구성 요소가 "둘 다"로 표시되고 STA에 인스턴스화되면 구성 요소는 STA 메시지 펌프를 차단합니다.

기타 고려 사항 및 시나리오

IIS에서 구성 요소를 사용할 계획이라면 고려해야 할 사항이 있습니다. IIS의 경우 "둘 다"가 권장 설정입니다. 주로 아파트 스레드 구성 요소의 잠금 문제를 피하기 위해 COM+ ObjectContext에 대한 성능 액세스 및 "무료"스레드 구성 요소가 시스템 보안 컨텍스트를 사용한다는 사실 (사용자의 보안 컨텍스트에 액세스 해야하는 경우). 보다 IIS의 구성 요소에 대한 스레딩 모델을 선택합니다 IIS 스레딩 고려 사항에 대한 자세한 정보.

고려해야 할 다른 것들은 COM+ 지원 및 구성 요소가 COM+에서 실행되는 경우 구성 요소와 인터페이스 포인터가 전달되고 저장되는지 여부입니다.

훌륭한 기사는입니다 COM+ 응용 프로그램의 COM 스레딩 및 응용 프로그램 아키텍처. com+ 초점이 있지만 com에 대해서도 설명합니다. 질문은 "스레딩 모델 권장 사항"이라는 섹션을 읽으십시오. Microsoft는 원본 기사를 제거하여 사본에 연결하고 있습니다.

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