2008-10-03 3 views
97

멀티 스레딩 : STAThread 및 STAThread에 대한 MSDN 문서에서

는 응용 프로그램에 대한 COM 스레딩 모델이 단일 스레드 아파트 (STA)이 있음을 나타냅니다.

는 (참고로, 그 the entire article입니다.)

내 머리 위로 넘어가 단일 스레드 아파트 ... OK. 또한 응용 프로그램에서 COM interop을 사용하지 않는 한이 특성은 실제로 아무 것도 수행하지 않습니다. 그렇다면 정확하게 무엇을 할 것이며 다중 스레드 응용 프로그램에 어떤 영향을 미치나요? MTThread를 사용하는 다중 스레드 응용 프로그램 (Timer을 사용하는 사람에서 스레드 풀 등이 아닌 비동기 메서드 호출에 이르기까지)이 '안전 할 것'이라 할지라도 MTAThread를 사용해야합니까? STAThread와 MTAThread는 실제로 무엇을합니까?

답변

58

아파트 스레드는 COM 개념입니다. COM을 사용하지 않고 호출하는 API 중 "덮개 아래에"COM을 사용하지 않으면 아파트에 대해 걱정할 필요가 없습니다.

아파트를 알아야 할 경우 세부 사항은 a little complicated입니다. 아마도 지나치게 단순화 된 버전은 STA로 태그 지정된 COM 개체가 STAThread에서 실행되어야하며 MTA로 표시된 COM 개체는 MTA 스레드에서 실행되어야합니다. 이러한 규칙을 사용하여 COM은 이러한 여러 개체 간의 호출을 최적화 할 수 있으므로 필요없는 곳에서 마샬링을 피할 수 있습니다.

+7

지나치게 단순화되었습니다. 다중 스레드 오브젝트는 모든 스레드에서 실행할 수 있습니다. 아파트 스레드 개체는 만든 아파트에서만 실행할 수 있습니다. –

+27

STA 스레드에서 MTA 개체에 대한 STA 개체 호출은 MTA 개체가 무료 스레드 마샬 러를 구현하지 않는 한 MTA 스레드로 마샬링합니다. . 내가 말했듯이 세부 사항은 복잡해 질 수 있습니다. (나는 COM 팀에서 여러 해 동안 일했습니다. * 웃어 넘기 *) – Bruce

+9

때때로 COM을 직접 사용하지 않더라도 이것을 알고 있어야합니다. 그래픽 창을 표시하는 스레드는 단일 스레드 아파트 모델을 사용해야합니다. 이것이 [STAThread]가 항상 Windows 양식 응용 프로그램의 기본 메서드 위에 표시되는 이유입니다. –

3

그것은 무엇이든지 CoInitialize이 매개 변수로 COINIT_APARTMENTTHREADED를 지정하여 호출되도록합니다. COM 구성 요소 나 ActiveX 컨트롤을 사용하지 않으면 아무런 영향을 미치지 않습니다. 그렇게한다면 그것은 매우 중요합니다. 그들에게 만든 아파트 스레드가 스레드 효과적으로 단 하나입니다

제어, 전화는 자신들이 창조되었다고 아파트에 처리 할 수 ​​

일부 자세한 내용을 MSDN에서 :.에서 만든

개체 단일 스레드 아파트 (STA)의 방법은, 그들의 아파트의 스레드에서 를 호출 그래서 호출이 직렬화하고 (메시지 큐 경계에서 때 는 Win32 함수를 PeekMessage 또는만 도착받을SendMessage가 호출 됨). 멀티 스레드 아파트 (MTA)에서 COM 스레드에서 만든

객체는 방법을받을 수 언제든지 다른 스레드에서 호출해야합니다. 당신은 일반적으로 개체의 데이터를 보호하기 위해 다음과 같은 중요한 부분, 세마포어, 또는 뮤텍스는 Win32 동기화 기본을 사용하여 다중 스레드 객체의 코드에서 동시성 제어의 형태를 구현하는 것입니다. 중립 스레드 아파트 (NTA)에 실행하도록 구성된 객체가 이동 단말기 또는 MTA 하나 인 스레드에 의해 호출

는 NTA에 스레드 전송한다. 이 스레드 이 나중에 CoInitializeEx를 호출하면 호출이 실패하고 RPC_E_CHANGED_MODE를 반환합니다.

+0

MSDN 기사는 COM 관점에서 유용하지만 .NET이'STAThread' 특성 /'ApartmentState'에 대한 응답으로 CoInitialize()를 호출 할 때 알려주시겠습니까? 참고 : MSDN의 문서는 다음과 같습니다. [CoInitializeEx function] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms695279%28v=vs.85%29.aspx). – jrh

+0

스레드가 시작될 때 @jrh가 호출됩니다. –

+0

[스레드 -> SetApartment] (https://github.com/dotnet/coreclr/blob/master/src/vm/comsynchronizable.cpp#L987)는'CoInitialize)'내부적으로? 나는 아래쪽으로 STAThread 속성을 추적했지만 흔적은 춥다. (Thread :: SetApartment의 소스를 찾을 수 없다.) thread.h (COM thread.h)의 Thread 클래스가 어디에서 문서화되어 있습니까? MFC, ATL 또는 다른 것입니까? – jrh

-14

STAThread는 C# GUI 프로젝트의 Main 기능 앞에 작성됩니다. 아무것도하지 않고 프로그램이 단일 스레드를 작성할 수 있도록합니다.

관련 문제