Share via


Felügyelt és nem felügyelt 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 menetelési elemeit a hozzávetőleges futásidejű megfelelőjükre képezi le. Vegye figyelembe, hogy ez a leképezés nem azonos funkciókat jelöl. A TerminateThread például nem hajt végre végül záradékokat, és nem szabadít fel 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 mindenképpen olvassa el alaposan a dokumentációt.

Win32-ben A közös nyelvi futtatókörnyezetben
CreateThread A szál és a ThreadStart
TerminateThread Thread.Abort
SuspendThread Thread.Suspend
ResumeThread Thread.Resume
Alvás Thread.Sleep
WaitForSingleObject a szálfogóponton 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
Közel a CoInitializeExhez (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és architektúrájáról:Folyamatok, szálak és apartmanok.) Az GetApartmentStateosztály , SetApartmentStateés metódusai Thread visszaadják és TrySetApartmentState hozzárendelik egy szál lakásállapotát. Ha az állapot nincs beállítva, GetApartmentState a visszaadott értéket adja ApartmentState.Unknownvissza.

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ód esetében az egyetlen módja annak, hogy szabályozni kell a lakás állapotát, ha alkalmazza a MTAThreadAttributeSTAThreadAttribute belépési pont eljárását.

A COM-nak kitett felügyelt objektumok úgy viselkednek, mintha összesítenék a szabadszálú rendezőt. 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, azok az objektumok, amelyek származnak ServicedComponent vagy StandardOleMarshalObjectszármaznak.

A felügyelt világban nincs támogatás a környezetek és a SynchronizationAttribute környezethez kötött felügyelt példányok használata nélkül. Ha Enterprise Servicest használ, akkor az objektumnak származnia ServicedComponent kell (amelyből származik ContextBoundObject).

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

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.EnterMonitor.TryEnter, Thread.Join, GC.WaitForPendingFinalizers, stb Thread.InterruptThread.Abort. Továbbá, ha a szál egy egyszálas lakásban van, ezek a felügyelt blokkolási műveletek megfelelően pumpálják az üzeneteket a lakásban, miközben a szál le van tiltva.

Szálak és szálak

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