Sdílet prostřednictvím


Spravované a nespravované zpracovávání vláken 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 vstoupí do modulu runtime přes, například, obálku volající COM, systém zkontroluje lokální úložiště toho 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 vláknu Thread.GetHashCode je stabilní identifikace spravovaného 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 vláken Win32 na spravované vlákna

Následující tabulka mapuje prvky threadingu Win32 na jejich přibližný ekvivalent za běhu programu. 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 však provede veškerý kód pro návrat zpět, 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 prostředí Common Language Runtime (CLR)
CreateThread Kombinace vláken a ThreadStart
TerminateThread Thread.Abort
SuspendThread Thread.Suspend
ResumeThread Thread.Resume
Spánek 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 COM apartmány

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 COM naleznete v tématu Procesy, Vlákna a Apartmány.) GetApartmentState, SetApartmentState, a TrySetApartmentState metody třídy Thread vracejí a přiřazují stav 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í vlákno a všechna vlákna řízená ThreadPool jsou MTA.

Důležité

Pro spouštěcí kód aplikace je jediným způsobem, jak nastavit stav vlákna, použít MTAThreadAttribute nebo STAThreadAttribute na proceduru vstupního bodu.

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 COM apartmánových proxy a kontextových obalů COM+ 1.0, jak diktováno OLE32.

Blokující problémy

Pokud vlákno provádí nespravované volání do operačního systému, což zablokovalo vlákno v nespravovaném kódu, modul runtime nepřevezme kontrolu nad ním pro Thread.Interrupt nebo Thread.Abort. V případě Thread.Abort označí modul runtime vlákno pro Abort a převezme nad ním kontrolu, když se znovu dostane do spravovaného kódu. Vhodnější je použít spravované blokování místo nespravovaného blokování. WaitHandle.WaitOne, WaitHandle.WaitAny, WaitHandle.WaitAll, Monitor.Enter, Monitor.TryEnter, Thread.Join, GC.WaitForPendingFinalizers, a tak dále jsou všechny citlivé na Thread.Interrupt a na Thread.Abort. Pokud je vaše vlákno v jednovláknovém apartmánu, všechny tyto spravované blokovací operace správně pumpují zprávy ve vašem apartmánu, zatímco je vaše 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é