Jegyzet
Az oldalhoz való hozzáférés engedélyezést igényel. Próbálhatod be jelentkezni vagy könyvtárat váltani.
Az oldalhoz való hozzáférés engedélyezést igényel. Megpróbálhatod a könyvtár váltását.
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 Framework 4 és az újabb verziókban, mivel létrehozhat olyan Task és Task<TResult> objektumokat, amelyek aszinkron feladatokat hajtanak végre a szálkészletben.
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álakként működnek. 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álpool egyik szála befejezte a feladatát, visszakerül a várakozó szálak sorába. 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észletben lévő szálak nem kezelt kivételei megszüntetik 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.
Megjegyzé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. Az ThreadPool.GetMinThreads metódus használatával elérheti ezeket a minimális értékeket.
Megjegyzé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.
Figyelmezteté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álpuffer használata
A szálkészletet a legegyszerűbben a Task Parallel Library (TPL) alkalmazásával használhatja. Alapértelmezés szerint a TPL típusok, például a Task és Task<TResult>, szálkészlet szálakat használnak a feladatok futtatásához.
A szálkészletet úgy is használhatja, hogy ThreadPool.QueueUserWorkItem meghívja a felügyelt kódból (vagy ICorThreadpool::CorQueueUserWorkItem nem felügyelt kódból), és átadja System.Threading.WaitCallback egy delegáltat, amely a feladatot végző metódust képviseli.
A szálkészlet használatának másik módja, hogy a várakozási művelethez kapcsolódó munkaelemeket a ThreadPool.RegisterWaitForSingleObject metódus segítségével sorba állítjuk, és egy System.Threading.WaitHandle paramétert adunk át, amely jelzéskor vagy időtúllépéskor meghívja a System.Threading.WaitOrTimerCallback delegált által képviselt eljárást. A szálkészlet szálai visszahívási függvények 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 biztosítja a ThreadPool.UnsafeQueueUserWorkItem és ThreadPool.UnsafeRegisterWaitForSingleObject metódusokat is. Ezeket a metódusokat csak akkor használja, ha biztos abban, hogy a hívó veremének nincs jelentősége az üzenetsorba helyezett feladat végrehajtása során elvégzett biztonsági ellenőrzések szempontjából. ThreadPool.QueueUserWorkItem és ThreadPool.RegisterWaitForSingleObject mindkettő rögzíti a hívó veremét, amely a szálkészlet szálának veremével 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észletből származó szálakat?
Több forgatókönyv is létezik, amelyekben indokolt saját szálakat létrehozni és kezelni a száltár szálak használata helyett:
- Előtérszálra van szükség.
- Egy szálnak egy adott prioritással kell rendelkeznie.
- Vannak olyan feladatai, amelyek miatt a szál hosszú időre blokkolódik. 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.