Megosztás:


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 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:

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.

Lásd még