ThreadPool Osztály

Definíció

Olyan szálkészletet biztosít, amely feladatok végrehajtására, munkaelemek közzétételére, aszinkron I/O feldolgozására, más szálak nevében való várakozásra és folyamat időzítőkre használható.

public ref class ThreadPool sealed
public ref class ThreadPool abstract sealed
public sealed class ThreadPool
public static class ThreadPool
type ThreadPool = class
Public NotInheritable Class ThreadPool
Public Class ThreadPool
Öröklődés
ThreadPool

Példák

Az alábbi példában a fő alkalmazásszál egy szálkészlet-szálon végrehajtandó metódust ThreadProc várólistára állít, egy másodpercig alszik, majd kilép. A ThreadProc metódus egyszerűen megjelenít egy üzenetet.

using System;
using System.Threading;

public class Example 
{
    public static void Main() 
    {
        // Queue the task.
        ThreadPool.QueueUserWorkItem(ThreadProc);
        Console.WriteLine("Main thread does some work, then sleeps.");
        Thread.Sleep(1000);

        Console.WriteLine("Main thread exits.");
    }

    // This thread procedure performs the task.
    static void ThreadProc(Object stateInfo) 
    {
        // No state object was passed to QueueUserWorkItem, so stateInfo is null.
        Console.WriteLine("Hello from the thread pool.");
    }
}
// The example displays output like the following:
//       Main thread does some work, then sleeps.
//       Hello from the thread pool.
//       Main thread exits.
Imports System.Threading

Public Module Example
    Public Sub Main()
        ' Queue the work for execution.
        ThreadPool.QueueUserWorkItem(AddressOf ThreadProc)
        
        Console.WriteLine("Main thread does some work, then sleeps.")

        Thread.Sleep(1000)

        Console.WriteLine("Main thread exits.")
    End Sub

    ' This thread procedure performs the task.
    Sub ThreadProc(stateInfo As Object)
        ' No state object was passed to QueueUserWorkItem, so stateInfo is null.
        Console.WriteLine("Hello from the thread pool.")
    End Sub
End Module
' The example displays output like the following:
'       Main thread does some work, then sleeps.
'       Hello from the thread pool.
'       Main thread exits.

Ha megjegyzést fűz a Thread.Sleep metódushoz, a fő szál kilép, mielőtt a metódus futna a szálkészlet szálán. A szálkészlet háttérszálakat használ, amelyek nem futtatják az alkalmazást, ha az összes előtérszál leállt. (Ez egy egyszerű példa egy versenyfeltételre.)

Megjegyzések

Számos alkalmazás olyan szálakat hoz létre, amelyek sok időt töltenek alvó állapotban, és várnak egy eseményre. Előfordulhat, hogy más szálak alvó állapotba kerülnek, és csak időszakosan ébrednek fel, hogy lekérdezzenek egy változási vagy frissítési állapotinformációt. A szálkészlet lehetővé teszi a szálak hatékonyabb használatát azáltal, hogy az alkalmazást a rendszer által felügyelt feldolgozó szálak készletével irányítja. A szálkészlet-szálakat használó műveletek például a következők:

  • Amikor létrehoz egy Task vagy Task<TResult> egy objektumot, amely aszinkron módon hajt végre bizonyos feladatokat, alapértelmezés szerint a tevékenység egy szálkészletszálon fut.

  • Az aszinkron időzítők a szálkészletet használják. A szálkészlet szálai visszahívásokat hajtanak végre az System.Threading.Timer osztályból, és eseményeket emelnek ki az System.Timers.Timer osztályból.

  • Regisztrált várakozási fogópontok használata esetén a rendszerszál figyeli a várakozási fogópontok állapotát. Ha egy várakozási művelet befejeződik, a szálkészlet egyik feldolgozószála végrehajtja a megfelelő visszahívási függvényt.

  • Amikor meghívja a QueueUserWorkItem metódust, hogy várólistára állítson egy végrehajtási metódust egy szálkészlet szálán. Ezt úgy teheti meg, hogy átadja a metódust egy meghatalmazottnak WaitCallback . A meghatalmazott rendelkezik az aláírásával

    void WaitCallback(Object state)
    
    Sub WaitCallback(state As Object)
    

    where state is an object that contains data to used by the delegate. A tényleges adatok a metódus meghívásával továbbíthatók a QueueUserWorkItem(WaitCallback, Object) meghatalmazottnak.

Note

A felügyelt szálkészlet szálai háttérszálak. Vagyis a tulajdonságaik IsBackgroundtrue. Ez azt jelenti, hogy egy ThreadPool szál nem fogja futtatni az alkalmazást, miután az összes előtérszál kilépett.

Important

Amikor a szálkészlet újra felhasznál egy szálat, nem törli az adatokat a szál helyi tárolójában vagy az ThreadStaticAttribute attribútummal megjelölt mezőkben. Ezért ha egy metódus megvizsgálja a szál helyi tárolóját vagy az ThreadStaticAttribute attribútummal megjelölt mezőket, a talált értékek a szálkészlet szálának korábbi használatából származhatnak.

Várólistára helyezhet olyan munkaelemeket is, amelyek nem kapcsolódnak a szálkészlet várakozási műveletéhez. Ha azt szeretné, hogy egy munkaelemet a szálkészlet egyik szála kezeljen, hívja meg a metódust QueueUserWorkItem . Ez a metódus paraméterként hivatkozik arra a metódusra vagy delegálásra, amelyet a szálkészletből kiválasztott szál hív meg. A várólistára helyezése után nem lehet megszakítani egy munkaelemet.

Az időzítő-üzenetsor időzítői és a regisztrált várakozási műveletek a szálkészletet is használják. A visszahívási függvények várólistára kerülnek a szálkészletben.

Folyamatonként egy szálkészlet van. A .NET Framework 4-től kezdve 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 GetMaxThreads szálak számának meghatározásához. A szálkészletben lévő szálak száma a metódussal SetMaxThreads módosítható. Minden szál az alapértelmezett veremméretet használja, és az alapértelmezett prioritáson fut.

Note

A .NET-keretrendszert futtató nem felügyelt kód az mscoree.h fájlban definiált CorSetMaxThreads függvény használatával módosíthatja a szálkészlet méretét.

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 tartozó maximális értéket. A maximális érték elérésekor a szálkészlet további szálakat hozhat létre ebben a kategóriában, vagy megvárhatja, amíg egyes feladatok befejeződnek. A .NET Framework 4-től kezdve 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.

Note

Alacsony igény esetén a szálkészlet szálainak tényleges száma a minimális értékek alá eshet.

Az GetMinThreads metódus használatával elérheti ezeket a minimális értékeket.

Caution

Ezzel a SetMinThreads módszerrel növelheti a 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.

Metódusok

Name Description
BindHandle(IntPtr)
Elavult.

Egy operációsrendszer-leírót köt a ThreadPool.

BindHandle(SafeHandle)

Egy operációsrendszer-leírót köt a ThreadPool.

GetAvailableThreads(Int32, Int32)

Lekéri a metódus által GetMaxThreads(Int32, Int32) visszaadott szálkészlet-szálak maximális száma és az aktuálisan aktív szám közötti különbséget.

GetMaxThreads(Int32, Int32)

Lekéri az egyidejűleg aktív szálkészlethez érkező kérések számát. A fenti kérések mindaddig várólistán maradnak, amíg a szálkészlet szálai elérhetővé nem válnak.

GetMinThreads(Int32, Int32)

Lekéri a szálkészlet által igény szerint létrehozott szálak minimális számát az új kérések teljesítésekor, mielőtt átváltana a szállétrehozás és -megsemmisítés kezelésére szolgáló algoritmusra.

QueueUserWorkItem(WaitCallback, Object)

Várólistára helyez egy végrehajtási metódust, és megadja a metódus által használandó adatokat tartalmazó objektumot. A metódus akkor hajtja végre, ha egy szálkészlet szála elérhetővé válik.

QueueUserWorkItem(WaitCallback)

Végrehajtási metódus várólistája. A metódus akkor hajtja végre, ha egy szálkészlet szála elérhetővé válik.

QueueUserWorkItem<TState>(Action<TState>, TState, Boolean)

Várólistára állítja a Action<T> meghatalmazott által a végrehajtáshoz megadott metódust, és megadja a metódus által használandó adatokat. A metódus akkor hajtja végre, ha egy szálkészlet szála elérhetővé válik.

RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, Int32, Boolean)

Regisztrál egy meghatalmazottat, hogy megvárjon egy WaitHandle32 bites aláírt egész számot az időtúllépéshez ezredmásodpercben.

RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, Int64, Boolean)

Regisztrál egy meghatalmazottat, hogy megvárjon egy WaitHandle64 bites aláírt egész számot az időtúllépéshez ezredmásodpercben.

RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, TimeSpan, Boolean)

Regisztrál egy meghatalmazottat, aki megvár egy WaitHandleidőtúllépési értéket megadva TimeSpan .

RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, UInt32, Boolean)

Regisztrál egy meghatalmazottat, hogy megvárjon egy WaitHandle32 bites aláíratlan egész számot az időkorláthoz ezredmásodpercben.

SetMaxThreads(Int32, Int32)

Beállítja az egyidejűleg aktív szálkészletre irányuló kérések számát. A fenti kérések mindaddig várólistán maradnak, amíg a szálkészlet szálai elérhetővé nem válnak.

SetMinThreads(Int32, Int32)

Beállítja a szálkészlet által igény szerint létrehozott szálak minimális számát az új kérések teljesítésekor, mielőtt átváltana a szállétrehozás és -megsemmisítés kezelésére szolgáló algoritmusra.

UnsafeQueueNativeOverlapped(NativeOverlapped*)

Egy átfedésben lévő I/O-műveletet vár a végrehajtáshoz.

UnsafeQueueUserWorkItem(WaitCallback, Object)

Várólistára állítja a megadott meghatalmazottat a szálkészlethez, de nem propagálja a hívó vermet a munkavégző szálra.

UnsafeRegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, Int32, Boolean)

Regisztrál egy meghatalmazottat, hogy megvárjon egy WaitHandle32 bites aláírt egész számot az időtúllépéshez ezredmásodpercben. Ez a metódus nem propagálja a hívó vermet a munkavégző szálra.

UnsafeRegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, Int64, Boolean)

Regisztrál egy meghatalmazottat, hogy megvárjon egy WaitHandle64 bites aláírt egész számot az időtúllépéshez ezredmásodpercben. Ez a metódus nem propagálja a hívó vermet a munkavégző szálra.

UnsafeRegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, TimeSpan, Boolean)

Regisztrál egy meghatalmazottat, aki megvár egy WaitHandleidőtúllépési értéket megadva TimeSpan . Ez a metódus nem propagálja a hívó vermet a munkavégző szálra.

UnsafeRegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, UInt32, Boolean)

Regisztrál egy meghatalmazottat, hogy megvárjon egy WaitHandle32 bites aláíratlan egész számot az időkorláthoz ezredmásodpercben. Ez a metódus nem propagálja a hívó vermet a munkavégző szálra.

A következőre érvényes:

Szálbiztonság

Ez a típus szálbiztos.

Lásd még