STAThread란?

STAThreadAttribute 속성의 의미에 대해서는, MSDN의 [STAThreadAttribute 클래스] 에 있습니다. 그 설명은, 「어플리케이션의 COM 스렛드모델이 단일스렛드아파트먼트(STA: Single-Threaded Apartment)인 것을 나타냅니다」라고 하는 것입니다. 만약 Main 메소드에 STAThreadAttribute 속성을 붙이지 않았으면, C#에서는, 멀티스렛드아파트먼트(MTA: multithreaded apartment)가 됩니다.

다만 VB.NET에서는, Main 메소드에 STAThreadAttribute 속성을 붙이지 않아도 STA가 됩니다.
STA와 MTA에 대해서는, Wikipedia의 [Component Object Model(컴포넌트 오브젝트 모델)] 에 설명이 있습니다. 간단하게 말하면, STA는 단일의 스렛드로 COM를 실행시키기 위해서 필요하고, 그것은 Windows의 메시지 큐를 이용해 행해집니다. 따라서 STA로 밖에 동작하지 않는 COM는 스렛드정책이 아닙니다만, MTA로 동작하는 COM는 스스로 스렛드의 동기를 취할 필요가 있어, 가끔 스렛드를 블록 합니다.
본론으로 돌아가서 Main 메소드에 STAThread가 필요한가? 라고 한다면, STA로 밖에 움직이지 않는 COM를 사용하는 경우는, 필요하다 라는 결론입니다.(VB.NET의 경우는 디폴트가 STA이므로 별도선언이 필요는 없습니다만, 명시적으로 기술해 두는 것이 좋을 것입니다). 많은 COM(특히 유저 인터페이스 관계의 COM)는 STA로 밖에 동작하지 않기 때문에, 통상은 COM를 사용하는 경우에 필요하게 됩니다.

스스로 COM를 직접 사용하지 않다고 해도 .NET Framework의 일부의 기능은 COM을 사용하고 있기 때문에, 그러한 기능을 사용하는 경우는 반드시 STA로 할 필요가 있습니다.

STA가 아니면 사용할 수 없는 .NET Framework의 기능에는, 이하와 같은 것이 있습니다.

(아래와 같은 [참고]에 있는 페이지등을 참고로 했습니다. )

1. 드러그&드롭 기능
2. 클립보드 관계의 기능
3. OpenFileDialog, SaveFileDialog와 같은 FileDialog의 상속 클래스나, FolderBrowserDialog 클래스에 의한 다이얼로그의 표시
4. WebBrowser 컨트롤
5. IME의 사용
6. RichTextBox 컨트롤의 일부의 기능(미확인)
7. 리플렉션을 이용한 메소드의 호출(. NET Framework 1.0만? )

Visual Studio의 코드 분석에서는, System.Windows.Forms 네임스페이스를 참조하고 있어서 Main 메소드에 STAThreadAttribute 속성이 붙지 않은 경우, 「Windows 폼의 엔트리 포인트를 STAThread로 마크 합니다」라고 하는 경고가 나옵니다. 이 경고의 설명에 의하면, STAThreadAttribute 속성은 Windows 폼을 사용하는 모든 어플리케이션의 엔트리 포인트로 지정할 필요가 있어, MTA는 Windows 폼으로 서포트되어 있지 않다고 하는 것입니다.
이러한 사항으로 보았을때, Windows 폼 어플리케이션에서는 Main 메소드에 STAThreadAttribute 속성이 필요하다고 생각해도 좋을 것입니다.

참고 : Why is STAThread required?

Could you explain STA and MTA?

+ Recent posts