[STAThread]는 무엇을합니까?


293

C # 3.5를 배우고 있는데 [STAThread]프로그램에서 무엇을 알고 싶 습니까?

답변:


240

이것은 STAThreadAttribute본질적으로 Windows 메시지 펌프가 COM 구성 요소와 통신하기위한 요구 사항입니다. 핵심 Windows Forms에서는 COM을 사용하지 않지만 시스템 대화 상자와 같은 OS의 많은 구성 요소가이 기술을 사용합니다.

MSDN 은 그 이유를 약간 더 자세히 설명합니다.

STAThreadAttribute는 응용 프로그램의 COM 스레드 모델이 단일 스레드 아파트임을 나타냅니다. 이 특성은 Windows Forms를 사용하는 모든 응용 프로그램의 진입 점에 있어야합니다. 생략하면 Windows 구성 요소가 올바르게 작동하지 않을 수 있습니다. 이 특성이 없으면 응용 프로그램은 Windows Forms에서 지원되지 않는 다중 스레드 아파트 모델을 사용합니다.

이 블로그 게시물 ( STAThread가 필요한 이유는 무엇입니까? )도 요구 사항에 대해 잘 설명합니다. 스레딩 모델이 CLR 수준에서 작동하는 방식에 대해보다 심도있게 보려면 2004 년 6 월 (2009 년 4 월)의 MSDN Magazine 기사를 참조하십시오 .


1
CompactFramework가 왜 지원하지 않는지 [STAThread]아십니까?
bvdb

1
stackoverflow.com/questions/4154429/apartmentstate-for-dummies 이 답변은 나와 같은 필사자에게 꽤 이해할 수 있습니다. 참조를 위해 여기에 추가
Barış Akkurt

41

컴파일러에게 단일 스레드 아파트 모델에 있음을 알려줍니다. 이것은 악의적 인 COM 작업으로, 일반적으로 Windows Forms (GUI)에 사용되며, 도면으로 Win32를 사용하므로 STA로 구현됩니다. 여러 스레드에서 STA 모델 인 것을 사용하면 손상된 객체가 발생합니다.

그렇기 때문에 다른 스레드에서 Gui를 호출해야합니다 (양식 코딩을 한 경우).

기본적으로 걱정하지 마십시오. Windows GUI 스레드가 STA으로 표시되어야한다는 점만 받아들입니다. 그렇지 않으면 이상한 일이 발생합니다.


2
STAThread는 GUI에 액세스 할 때 기본 스레드를 호출하기위한 요구 사항과 관련이 없습니다. 이것은 단순히 Windows 메시지 펌프의 특성으로 인한 것이며 다중 스레드 응용 프로그램에서는 더 일반적으로 피할 수 없습니다.
Noldorin

3
실제로 OS 대화 상자 및 타사 구성 요소와 같은 COM 구성 요소를 다루는 것입니다.
Noldorin

3
Win32는 스레딩 아파트 개념을 가지고 있지 않으며 COM은 개념을 소개합니다. COM은 COM 아파트에서 코드 실행을 동기화 / 직렬화하기위한 수단으로서 전체 스레드 불가 지 시스템 (Windows 메시지 펌프)을 "재 작업"합니다.
AnthonyWJones

1
Windows GUI theads가 STA으로 표시되어 있어야합니다. :))))))
Nipuna

1
@Noldorin "메인 스레드를 호출하기위한 요구 사항 "– 이것은 기술적으로 요구 사항 이 아닙니다 . 크로스 스레드 예외는 디버거 외부에서 발생하지 않습니다. 참고 : stackoverflow.com/questions/3972727/... . 그러나이 문제를 해결해서는 안된다고 말하지 마십시오!
Shiv

31

STAThreadAttribute는 COM이 필요한 경우 단일 스레드 COM 아파트를 사용하도록 스레드를 표시합니다. 기본적으로 .NET은 COM을 전혀 초기화하지 않습니다. COM 개체 또는 COM 컨트롤이 생성되거나 드래그 앤 드롭이 필요한 경우와 같이 COM이 필요한 경우에만 COM이 초기화됩니다. 이 경우 .NET은 기본 CoInitializeEx 함수를 호출합니다.이 함수는 스레드를 멀티 스레드 또는 단일 스레드 아파트에 조인할지 여부를 나타내는 플래그를 사용합니다.

자세한 정보는 여기 (2009 년 6 월)

STAThread가 필요한 이유는 무엇입니까?

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.