Sdílet prostřednictvím


Spravované a nespravované vlákno ve Windows

Správa všech vláken se provádí prostřednictvím Thread třídy, včetně vláken vytvořených modulem CLR (Common Language Runtime) a vláken vytvořených mimo modul runtime, které zadávají spravované prostředí pro spuštění kódu. Modul runtime monitoruje všechna vlákna v procesu, která někdy spustila kód v rámci spravovaného spouštěcího prostředí. Nesleduje žádná další vlákna. Vlákna můžou vstoupit do spravovaného spouštěcího prostředí prostřednictvím zprostředkovatele komunikace modelu COM (protože modul runtime zveřejňuje spravované objekty jako objekty modelu COM nespravovanému světu), funkci COM DllGetClassObject a vyvolání platformy.

Když nespravované vlákno přejde do modulu runtime, například obálka s možností volání modelu COM, systém zkontroluje místní úložiště vlákna tohoto vlákna a vyhledá interní spravovaný Thread objekt. Pokud se najde, modul runtime už o tomto vláknu ví. Pokud ho ale nemůže najít, modul runtime vytvoří nový Thread objekt a nainstaluje ho do místního úložiště vlákna daného vlákna.

Ve spravovaném podprocesu Thread.GetHashCode je stabilní spravovaná identifikace vlákna. Po celou dobu životnosti vlákna nebude kolidovat s hodnotou z jakéhokoli jiného vlákna bez ohledu na doménu aplikace, ze které tuto hodnotu získáte.

Mapování z podprocesů Win32 na spravované vlákno

Následující tabulka mapuje prvky vlákna Win32 na jejich přibližný ekvivalent modulu runtime. Všimněte si, že toto mapování nepředstavuje identické funkce. TerminateThread například nespustí klauzule finally nebo uvolní prostředky a nelze jim zabránit. Thread.Abort Provede však veškerý zpětný kód, uvolní všechny prostředky a může být odepřen pomocí ResetAbort. Před vytvořením předpokladů o funkčnosti si pečlivě přečtěte dokumentaci.

Ve Win32 V modulu CLR (Common Language Runtime)
CreateThread Kombinace vláken aThreadStart
TerminateThread Thread.Abort
SuspendThread Thread.Suspend
ResumeThread Thread.Resume
Spát Thread.Sleep
WaitForSingleObject v popisovači vlákna Thread.Join
ExitThread Žádný ekvivalent
GetCurrentThread Thread.CurrentThread
SetThreadPriority Thread.Priority
Žádný ekvivalent Thread.Name
Žádný ekvivalent Thread.IsBackground
Close to CoInitializeEx (OLE32.DLL) Thread.ApartmentState

Spravované vlákna a apartmány MODELU COM

Spravované vlákno lze označit tak, že bude hostitelem apartmánu s jedním vláknem nebo vícevláknovým vláknem . (Další informace o architektuře vláken MODELU COM najdete v tématu Procesy, vlákna a apartmány.) GetApartmentState, SetApartmentStatea TrySetApartmentState metody Thread třídy return a přiřadit stav bytu vlákna. Pokud stav nebyl nastaven, GetApartmentState vrátí hodnotu ApartmentState.Unknown.

Vlastnost lze nastavit pouze v případě, že je vlákno ve ThreadState.Unstarted stavu; lze ji nastavit pouze jednou pro vlákno.

Pokud stav bytu není nastaven před spuštěním vlákna, vlákno se inicializuje jako vícevláknový byt (MTA). Finalizační závit a všechna vlákna řízená ThreadPool pomocí MTA.

Důležité

Pro spouštěcí kód aplikace je jediným způsobem, jak řídit stav bytu, použít MTAThreadAttribute postup vstupního bodu nebo STAThreadAttribute na vstupní bod.

Spravované objekty, které jsou vystaveny modelu COM, se chovají, jako by agregovaly bezvláknový marshaller. Jinými slovy, lze je volat z libovolného apartmánu COM volným způsobem. Jedinými spravovanými objekty, které nevykazují toto chování bez vláken, jsou objekty, které jsou odvozeny z ServicedComponent nebo StandardOleMarshalObject.

Ve spravovaném světě neexistuje žádná podpora SynchronizationAttribute , pokud nepoužíváte kontexty a spravované instance vázané na kontext. Pokud používáte služby Enterprise Services, musí být objekt odvozen od ServicedComponent (který je odvozen od ContextBoundObject).

Když spravovaný kód volá objekty MODELU COM, vždy se řídí pravidly modelu COM. Jinými slovy, volá prostřednictvím proxy serverů byt COM a COM+ 1.0 kontextové obálky podle OLE32.

Blokující problémy

Pokud vlákno provádí nespravované volání do operačního systému, který blokoval vlákno v nespravovaném kódu, modul runtime nebude převzít kontrolu nad ním nebo Thread.InterruptThread.Abort. V případě modulu runtime označí vlákno Abort a převezme kontrolu nad ním při opětovném zadání spravovaného Thread.Abortkódu. Vhodnější je použít spravované blokování místo nespravovaného blokování. WaitHandle.WaitOne,WaitHandle.WaitAny, , Monitor.EnterWaitHandle.WaitAll, Monitor.TryEnter, Thread.JoinGC.WaitForPendingFinalizers, a tak dále jsou všechny reakce na Thread.Interrupt a na Thread.Abort. Pokud je vlákno v apartmánu s jedním vláknem, všechny tyto spravované blokovací operace správně pumpují zprávy ve vašem bytě, zatímco je vlákno blokováno.

Vlákna a vlákna

Model vláken .NET nepodporuje vlákna. Neměli byste volat žádnou nespravovanou funkci, která je implementována pomocí vláken. Taková volání můžou způsobit chybové ukončení modulu runtime .NET.

Viz také