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
Visszajelzés
https://aka.ms/ContentUserFeedback.
Hamarosan elérhető: 2024-ben fokozatosan kivezetjük a GitHub-problémákat a tartalom visszajelzési mechanizmusaként, és lecseréljük egy új visszajelzési rendszerre. További információ:Visszajelzés küldése és megtekintése a következőhöz: