Felügyelt és felügyelet nélküli szálkezelés a Windowsban

Az összes szál kezelése az osztályon keresztül történik, beleértve a Thread közös nyelvi futtatókörnyezet által létrehozott és a futtatókörnyezeten kívül létrehozott szálakat is, amelyek a felügyelt környezetbe lépnek a kód végrehajtásához. A futtatókörnyezet figyeli a folyamat összes olyan szálát, amely valaha végrehajtott kódot a felügyelt végrehajtási környezetben. Nem követi nyomon a többi szálat. A szálak a COM-interopon keresztül léphetnek be a felügyelt végrehajtási környezetbe (mivel a futtatókörnyezet a felügyelt objektumokat COM-objektumként teszi elérhetővé a nem felügyelt világ számára), a COM DllGetClassObject függvényt és a platformhívást.

Ha egy nem felügyelt szál például egy com-hívó burkolón keresztül lép be a futtatókörnyezetbe, a rendszer ellenőrzi a szál helyi tárolóját, hogy belső felügyelt Thread objektumot keressen. Ha talál ilyet, a futtatókörnyezet már ismeri ezt a szálat. Ha azonban nem talál egyet, a futtatókörnyezet létrehoz egy új Thread objektumot, és telepíti azt a szál helyi tárolójában.

A felügyelt szálkezelésben Thread.GetHashCode a stabil felügyelt szálazonosítás. A szál élettartama alatt nem ütközik más szál értékével, függetlenül attól, hogy melyik alkalmazástartományból szerzi be ezt az értéket.

Leképezés Win32-szálkezelésről felügyelt szálkezelésre

Az alábbi táblázat a Win32 szálkezelési elemeit a hozzávetőleges futásidejű megfelelőikhez vetíti. Vegye figyelembe, hogy ez a leképezés nem azonos funkciókat jelöl. Például TerminateThread nem hajt végre záradékokat, nem szabadít fel finally erőforrásokat, és nem akadályozható meg. Thread.Abort Azonban végrehajtja az összes visszaállítási kódot, visszaköveteli az összes erőforrást, és megtagadható a használatávalResetAbort. A funkciókkal kapcsolatos feltételezések előtt olvassa el alaposan a dokumentációt.

Megjegyzés:

Thread.Abort csak a .NET-keretrendszerben érhető el. A .NET 5-ös és újabb verzióiban PlatformNotSupportedException kivételt dob. További információ: SYSLIB0006: A Thread.Abort nem támogatott.

Win32-ben A közös nyelvi futtatókörnyezetben
CreateThread A szál és aThreadStart
TerminateThread Thread.Abort
SuspendThread Thread.Suspend
ResumeThread Thread.Resume
Alszik Thread.Sleep
WaitForSingleObject a szál kezelőjén Thread.Join
ExitThread Nincs egyenértékű
GetCurrentThread Thread.CurrentThread
SetThreadPriority Thread.Priority
Nincs egyenértékű Thread.Name
Nincs egyenértékű Thread.IsBackground
CoInitializeEx közelében (OLE32.DLL) Thread.ApartmentState

Felügyelt szálak és COM-apartmanok

A felügyelt szál megjelölhető, hogy jelezze, hogy egyszálas vagy többszálas lakást fog üzemeltetni. (További információ a COM szálkezelési architektúrájáról: Folyamatok, Szálak és Apartmanok.) A(z) GetApartmentState, SetApartmentState és TrySetApartmentState metódusok a Thread osztályban visszaadják és hozzárendelik egy szál apartmanállapotát. Ha az állapot nincs beállítva, GetApartmentState a ApartmentState.Unknown értékét adja vissza.

A tulajdonság csak akkor állítható be, ha a szál állapotban ThreadState.Unstarted van, és csak egyszer állítható be egy szálhoz.

Ha a lakás állapota nincs beállítva a szál elindítása előtt, a szál inicializálva lesz többszálas lakásként (MTA). A finalizer szál és az általuk vezérelt ThreadPool összes szál az MTA.

Fontos

Az alkalmazásindítási kódban az egyetlen módja a lakásállapot szabályozásának az, ha a MTAThreadAttribute vagy STAThreadAttribute alkalmazza a belépési pont eljáráshoz.

A COM-nak kitett felügyelt objektumok úgy viselkednek, mintha összesítenék a szabad szálas marshallert. Más szóval bármilyen COM-lakásból hívhatók, szabadon menetes módon. Az egyetlen felügyelt objektum, amely nem mutatja ezt a szabadszálas viselkedést, az olyan objektumok, amelyek a ServicedComponent vagy StandardOleMarshalObject-ből származnak.

A felügyelt világban nincs támogatás a SynchronizationAttribute, hacsak nem használ kontextusokat és kontextushoz kötött felügyelt példányokat. Ha Enterprise Services-t használ, akkor az objektumának ServicedComponent-ből kell származnia (amely maga is ContextBoundObject-ből származik).

Amikor a felügyelt kód meghívja a COM-objektumokat, mindig a COM-szabályokat követi. Más szóval, az OLE32 által diktált COM apartman proxykon és COM+ 1.0 környezetburkolókon keresztül hívja meg.

Blokkolási problémák

Ha egy szál nem felügyelt hívást indít az operációs rendszerbe, amely letiltotta a szálat nem felügyelt kódban, a futtatókörnyezet nem fogja átvenni annak irányításátThread.Interrupt.Thread.Abort Ebben az esetben a futtatókörnyezet megjelöli Thread.Abortaz Abort-szálat , és átveszi annak irányítását, amikor újra beírja a felügyelt kódot. Jobb, ha felügyelt blokkolást használ a nem felügyelt blokkolás helyett. WaitHandle.WaitOne, WaitHandle.WaitAny, WaitHandle.WaitAll, Monitor.Enter, Monitor.TryEnter, Thread.Join, GC.WaitForPendingFinalizers és így tovább mind érzékenyek Thread.Interrupt-re és Thread.Abort-re. Továbbá, ha a szál egy egyszálas apartmanban van, ezek a kezelt blokkolási műveletek megfelelően továbbítják az üzeneteket az apartmanban, miközben a szál blokkolódik.

Szálak és rostok

A .NET szálmodell nem támogatja a szálakat. Nem szabad meghívni semmilyen nem felügyelt függvényt, amely szálak használatával implementálható. Az ilyen hívások a .NET-futtatókörnyezet összeomlását eredményezhetik.

Lásd még