[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.