공용 언어 런타임에서 만든 스레드와 코드를 실행하기 위해 관리되는 환경을 입력하는 런타임 외부에서 만든 스레드를 포함하여 클래스를 통해 Thread 모든 스레드를 관리합니다. 런타임은 관리되는 실행 환경 내에서 코드를 실행한 프로세스의 모든 스레드를 모니터링합니다. 다른 스레드는 추적하지 않습니다. 스레드는 COM interop을 통해 관리되는 실행 환경에 들어갈 수 있습니다(런타임은 관리되는 개체를 관리되지 않는 세계에 COM 개체로 노출하기 때문에), COM DllGetClassObject 함수 및 플랫폼 호출.
관리되지 않는 스레드가 COM 호출 가능 래퍼와 같이 런타임에 들어가면 시스템은 해당 스레드의 스레드 로컬 저장소를 검사하여 내부 관리 Thread 되는 개체를 찾습니다. 이 스레드가 발견되면 런타임은 이미 이 스레드를 알고 있습니다. 그러나 찾을 수 없는 경우 런타임은 새 Thread 개체를 빌드하고 해당 스레드의 스레드 로컬 저장소에 설치합니다.
관리 스레딩에서는 Thread.GetHashCode가 안정적인 관리 스레드 식별자입니다. 스레드의 수명 동안 이 값을 가져오는 애플리케이션 도메인에 관계없이 다른 스레드의 값과 충돌하지 않습니다.
Win32 스레딩에서 관리되는 스레딩으로 매핑
다음 표에서는 Win32 스레딩 요소를 적절한 런타임의 대응 항목으로 매핑합니다. 이 매핑은 동일한 기능을 나타내지 않습니다. 예를 들어 TerminateThread 는 finally 절을 실행하거나 리소스를 해제하지 않으며 방지할 수 없습니다. 그러나 Thread.Abort는 모든 롤백 코드를 실행하고, 모든 리소스를 회수하며, ResetAbort를 사용하여 이를 거부할 수 있습니다. 기능에 대해 가정하기 전에 설명서를 자세히 읽어야 합니다.
Win32에서 | 공용 언어 런타임에서 |
---|---|
CreateThread | 스레드와 스레드 의 조합 ThreadStart |
TerminateThread | Thread.Abort |
SuspendThread | Thread.Suspend |
ResumeThread (스레드 재개) | Thread.Resume |
절전 | Thread.Sleep |
스레드 핸들에 대한 WaitForSingleObject | Thread.Join |
쓰레드 종료 | 동등한 항목 없음 |
GetCurrentThread | Thread.CurrentThread |
SetThreadPriority | Thread.Priority |
동등한 항목 없음 | Thread.Name |
동등한 항목 없음 | Thread.IsBackground |
CoInitializeEx(OLE32.DLL)에 가깝습니다. | Thread.ApartmentState |
관리되는 스레드 및 COM 아파트
관리되는 스레드를 표시하여 단일 스레드 또는 다중 스레드 아파트를 호스트함을 나타낼 수 있습니다. COM 스레딩 아키텍처에 대한 자세한 내용은 프로세스, 스레드 및 아파트를 참조하세요. GetApartmentState클래스의 메서드 SetApartmentState는 TrySetApartmentState 스레드의 Thread 아파트 상태를 반환하고 할당합니다. 상태가 설정되지 않은 경우, GetApartmentState은(는) ApartmentState.Unknown을(를) 반환합니다.
이 속성은 스레드가 상태에 있을 때만 설정할 수 있으며 스레드 ThreadState.Unstarted 에 대해 한 번만 설정할 수 있습니다.
스레드가 시작되기 전에 아파트 상태가 설정되지 않은 경우 스레드는 MTA(다중 스레드 아파트)로 초기화됩니다. 종료자 스레드와 ThreadPool에 의해 제어되는 모든 스레드는 MTA입니다.
중요합니다
애플리케이션 시작 코드의 경우, 아파트 상태를 제어하는 유일한 방법은 MTAThreadAttribute 또는 STAThreadAttribute을(를) 진입점 프로시저에 적용하는 것입니다.
COM에 노출되는 관리 개체는 자유 스레드 마샬러를 집계한 것처럼 동작합니다. 즉, 무료 스레드 방식으로 COM 아파트에서 호출할 수 있습니다. 이 자유 스레드 동작을 나타내지 않는 관리되는 개체는 ServicedComponent 또는 StandardOleMarshalObject에서 파생된 개체뿐입니다.
관리되는 환경에서는 컨텍스트 및 컨텍스트에 바인딩된 관리되는 인스턴스를 사용하지 않으면 SynchronizationAttribute가 지원되지 않습니다. Enterprise Services를 사용하는 경우 개체는 ServicedComponent에서 파생되어야 합니다(ServicedComponent 자체는 에서 파생된 것임을 나타냄).
관리 코드가 COM 개체를 호출하는 경우 항상 COM 규칙을 따릅니다. 즉, OLE32에서 지시한 대로 COM 아파트 프록시 및 COM+ 1.0 컨텍스트 래퍼를 통해 호출합니다.
차단 문제
스레드가 관리되지 않는 코드에서 스레드를 차단한 운영 체제에 대해 관리되지 않는 호출을 수행하는 경우, 런타임은 Thread.Interrupt 또는 Thread.Abort 동안 그 스레드를 제어하지 않습니다. Thread.Abort의 경우, 런타임은 스레드를 중단으로 표시하고, 관리 코드를 다시 진입할 때 이를 제어합니다. 관리되지 않는 차단보다는 관리되는 차단을 사용하는 것이 좋습니다. WaitHandle.WaitOne,WaitHandle.WaitAny,WaitHandle.WaitAll,Monitor.Enter,Monitor.TryEnter,Thread.Join,GC.WaitForPendingFinalizers 등은 모두 Thread.Interrupt와 Thread.Abort에 반응합니다. 또한 스레드가 단일 스레드 아파트에 있는 경우 이러한 모든 관리되는 차단 작업은 스레드가 차단되는 동안 아파트에서 메시지를 올바르게 펌핑합니다.
스레드 및 파이버
.NET 스레딩 모델은 파이버를 지원하지 않습니다. 파이버를 사용하여 구현되는 관리되지 않는 함수를 호출해서는 안 됩니다. 이러한 호출로 인해 .NET 런타임이 충돌할 수 있습니다.
참고하십시오
.NET