A felügyelt szálkészlet
Az System.Threading.ThreadPool osztály a rendszer által felügyelt feldolgozószálak készletét biztosítja az alkalmazásnak, így a szálkezelés helyett az alkalmazásfeladatokra összpontosíthat. Ha rövid, háttérfeldolgozást igénylő feladatokkal rendelkezik, a felügyelt szálkészlet segítségével egyszerűen kihasználhatja a több szál előnyeit. A szálkészlet használata jelentősen egyszerűbb a 4. keretrendszerben és újabb verziókban, mivel olyan objektumokat hozhat létre és Task<TResult> hozhat létreTask, amelyek aszinkron feladatokat hajtanak végre a szálkészlet-szálakon.
A .NET számos célra használ szálkészlet-szálakat, beleértve a feladat párhuzamos kódtárának (TPL) műveleteit, az aszinkron I/O-befejezést, az időzítő visszahívásait, a regisztrált várakozási műveleteket, a meghatalmazottak használatával végzett aszinkron metódushívásokat és System.Net a szoftvercsatorna-kapcsolatokat.
A szálkészlet jellemzői
A szálkészlet szálai háttérszálak . Minden szál az alapértelmezett veremméretet használja, az alapértelmezett prioritáson fut, és a többszálas lakásban található. Miután a szálkészlet egyik szála befejezte a feladatát, a rendszer visszakerül a várólistára. Ettől a pillanattól kezdve újra felhasználható. Ez az újrahasználat lehetővé teszi az alkalmazások számára, hogy elkerüljék az új szál létrehozásának költségeit az egyes tevékenységekhez.
Folyamatonként csak egy szálkészlet van.
A szálkészletszálak kivételei
A szálkészlet-szálak nem kezelt kivételei megszakítják a folyamatot. A szabálynak három kivétele van:
- A System.Threading.ThreadAbortException a szálkészlet szálába kerül, mert Thread.Abort meghívták.
- Egy System.AppDomainUnloadedException szálkészlet-szálba kerül, mert az alkalmazástartomány kiürítve van.
- A közös nyelvi futtatókörnyezet vagy egy gazdagépfolyamat leállítja a szálat.
További információ: Kivételek a felügyelt szálakban.
Szálkészlet szálainak maximális száma
A szálkészletbe várólistára állítható műveletek számát csak a rendelkezésre álló memória korlátozza. A szálkészlet azonban korlátozza az egyidejűleg aktív szálak számát. Ha az összes szálkészlet-szál foglalt, a rendszer további munkaelemeket is várólistára állít, amíg a végrehajtásukhoz tartozó szálak elérhetővé nem válnak. A folyamat szálkészletének alapértelmezett mérete számos tényezőtől függ, például a virtuális címtér méretétől. A folyamat meghívhatja a metódust a ThreadPool.GetMaxThreads szálak számának meghatározásához.
A szálak ThreadPool.GetMaxThreadsThreadPool.SetMaxThreads maximális számát a módszerekkel szabályozhatja.
Feljegyzés
A közös nyelvi futtatókörnyezetet futtató kód a metódussal állíthatja be a méretet ICorThreadpool::CorSetMaxThreads
.
Szálkészlet minimális száma
A szálkészlet igény szerint új feldolgozószálakat vagy I/O-befejezési szálakat biztosít, amíg el nem éri az egyes kategóriákhoz megadott minimális értéket. A metódus használatával beolvashatja ezeket a ThreadPool.GetMinThreads minimális értékeket.
Feljegyzés
Alacsony igény esetén a szálkészlet szálainak tényleges száma a minimális értékek alá eshet.
A minimális érték elérésekor a szálkészlet további szálakat hozhat létre, vagy megvárhatja, amíg egyes feladatok befejeződnek. A szálkészlet létrehozza és megsemmisíti a feldolgozó szálakat az átviteli sebesség optimalizálása érdekében, amely az időegységenként elvégzett tevékenységek számaként van definiálva. Előfordulhat, hogy túl kevés szál nem használja ki optimálisan a rendelkezésre álló erőforrásokat, míg a túl sok szál növelheti az erőforrás-versengést.
Figyelemfelhívás
Ezzel a ThreadPool.SetMinThreads módszerrel növelheti az inaktív szálak minimális számát. Az értékek szükségtelen növelése azonban teljesítményproblémákat okozhat. Ha túl sok tevékenység indul el egyszerre, akkor az összes lassúnak tűnhet. A legtöbb esetben a szálkészlet a saját algoritmusával jobban teljesít a szálak kiosztásához.
A szálkészlet használata
A szálkészletet a legegyszerűbben a tevékenység párhuzamos kódtára (TPL) használatával használhatja. Alapértelmezés szerint a TPL-típusok kedvelik Task és Task<TResult> használják a szálkészlet-szálakat a feladatok futtatásához.
A szálkészletet ThreadPool.QueueUserWorkItem úgy is használhatja, hogy meghívja a felügyelt kódból (vagy ICorThreadpool::CorQueueUserWorkItem
nem felügyelt kódból), és átadja System.Threading.WaitCallback a feladatot végrehajtó metódust képviselő meghatalmazottat.
A szálkészlet használatának másik módja a várakozási művelethez kapcsolódó munkaelemek várólistára helyezése a ThreadPool.RegisterWaitForSingleObject metódus használatával, és egy olyan üzenet átadása System.Threading.WaitHandle , amely jelzéskor vagy időtúllépéskor meghívja a System.Threading.WaitOrTimerCallback meghatalmazott által képviselt metódust. A szálkészlet szálai visszahívási módszerek meghívására szolgálnak.
A példákért tekintse meg a hivatkozott API-lapokat.
Biztonsági ellenőrzések kihagyása
A szálkészlet a metódusokat és ThreadPool.UnsafeRegisterWaitForSingleObject a ThreadPool.UnsafeQueueUserWorkItem metódusokat is biztosítja. Ezeket a metódusokat csak akkor használja, ha biztos abban, hogy a hívó verem nem releváns az üzenetsorba helyezett feladat végrehajtása során végrehajtott biztonsági ellenőrzésekhez. ThreadPool.QueueUserWorkItem és ThreadPool.RegisterWaitForSingleObject mindkettő rögzíti a hívó veremét, amely a szálkészlet szálának veremébe lesz egyesítve, amikor a szál elkezdi végrehajtani a feladatot. Ha biztonsági ellenőrzésre van szükség, a teljes vermet ellenőrizni kell. Bár az ellenőrzés biztonságot nyújt, teljesítményköltséggel is jár.
Mikor ne használjon szálkészlet-szálakat?
Több forgatókönyv is létezik, amelyekben a szálkészlet-szálak használata helyett célszerű saját szálakat létrehozni és kezelni:
- Előtérszálra van szükség.
- Egy szálnak egy adott prioritással kell rendelkeznie.
- Vannak olyan tevékenységei, amelyek miatt a szál hosszú ideig blokkolva lesz. A szálkészlet maximális számú szálat tartalmazhat, így a blokkolt szálak nagy száma megakadályozhatja a tevékenységek indítását.
- Egyszálas lakásba kell helyeznie a szálakat. Minden ThreadPool szál a többszálas lakásban van.
- Stabil identitást kell társítania a szálhoz, vagy egy szálat feladatnak kell szentelnie.