ThreadPool.QueueUserWorkItem Methode

Definitie

Een methode voor uitvoering in de wachtrij plaatsen. De methode wordt uitgevoerd wanneer een threadpool-thread beschikbaar komt.

Overloads

Name Description
QueueUserWorkItem(WaitCallback)

Een methode voor uitvoering in de wachtrij plaatsen. De methode wordt uitgevoerd wanneer een threadpool-thread beschikbaar komt.

QueueUserWorkItem(WaitCallback, Object)

Hiermee wordt een methode voor uitvoering in de wachtrij geplaatst en wordt een object opgegeven dat gegevens bevat die door de methode moeten worden gebruikt. De methode wordt uitgevoerd wanneer een threadpool-thread beschikbaar komt.

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

Hiermee wordt een methode in de wachtrij geplaatst die is opgegeven door een Action<T> gemachtigde voor uitvoering en worden gegevens geleverd die door de methode moeten worden gebruikt. De methode wordt uitgevoerd wanneer een threadpool-thread beschikbaar komt.

QueueUserWorkItem(WaitCallback)

Een methode voor uitvoering in de wachtrij plaatsen. De methode wordt uitgevoerd wanneer een threadpool-thread beschikbaar komt.

public:
 static bool QueueUserWorkItem(System::Threading::WaitCallback ^ callBack);
public static bool QueueUserWorkItem(System.Threading.WaitCallback callBack);
static member QueueUserWorkItem : System.Threading.WaitCallback -> bool
Public Shared Function QueueUserWorkItem (callBack As WaitCallback) As Boolean

Parameters

callBack
WaitCallback

Een WaitCallback die de methode vertegenwoordigt die moet worden uitgevoerd.

Retouren

true als de methode in de wachtrij is geplaatst; NotSupportedException wordt gegenereerd als het werkitem niet in de wachtrij kan worden geplaatst.

Uitzonderingen

callBack is null.

De Common Language Runtime (CLR) wordt gehost en de host biedt geen ondersteuning voor deze actie.

Voorbeelden

In het volgende voorbeeld wordt de overbelasting van de methode gebruikt om een taak in de QueueUserWorkItem(WaitCallback) wachtrij te plaatsen, die wordt vertegenwoordigd door de ThreadProc methode, om uit te voeren wanneer een thread beschikbaar wordt. Er wordt geen taakinformatie geleverd bij deze overbelasting. Daarom is de informatie die beschikbaar is voor de ThreadProc methode beperkt tot het object waartoe de methode behoort.

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.

Opmerkingen

U kunt gegevens die vereist zijn voor de methode in de wachtrij plaatsen in de instantievelden van de klasse waarin de methode is gedefinieerd, of u kunt de QueueUserWorkItem(WaitCallback, Object) overbelasting gebruiken die een object accepteert dat de benodigde gegevens bevat.

Note

Visual Basic gebruikers de WaitCallback constructor weglaten en gewoon de operator AddressOf gebruiken bij het doorgeven van de callback-methode aan QueueUserWorkItem. Visual Basic roept automatisch de juiste gemachtigde constructor aan.

De Thread.CurrentPrincipal eigenschapswaarde wordt doorgegeven aan werkthreads in de wachtrij met behulp van de QueueUserWorkItem methode.

Zie ook

Van toepassing op

QueueUserWorkItem(WaitCallback, Object)

Hiermee wordt een methode voor uitvoering in de wachtrij geplaatst en wordt een object opgegeven dat gegevens bevat die door de methode moeten worden gebruikt. De methode wordt uitgevoerd wanneer een threadpool-thread beschikbaar komt.

public:
 static bool QueueUserWorkItem(System::Threading::WaitCallback ^ callBack, System::Object ^ state);
public static bool QueueUserWorkItem(System.Threading.WaitCallback callBack, object state);
static member QueueUserWorkItem : System.Threading.WaitCallback * obj -> bool
Public Shared Function QueueUserWorkItem (callBack As WaitCallback, state As Object) As Boolean

Parameters

callBack
WaitCallback

Een WaitCallback weergave van de methode die moet worden uitgevoerd.

state
Object

Een object met gegevens dat door de methode moet worden gebruikt.

Retouren

true als de methode in de wachtrij is geplaatst; NotSupportedException wordt gegenereerd als het werkitem niet in de wachtrij kan worden geplaatst.

Uitzonderingen

De Common Language Runtime (CLR) wordt gehost en de host biedt geen ondersteuning voor deze actie.

callBack is null.

Voorbeelden

In het volgende voorbeeld wordt de .NET threadpool gebruikt om het resultaat Fibonacci te berekenen voor vijf getallen tussen 20 en 40. Elk Fibonacci resultaat wordt weergegeven door de Fibonacci klasse, die een methode biedt die ThreadPoolCallback de berekening uitvoert. Er wordt een object gemaakt dat elke Fibonacci waarde vertegenwoordigt en de ThreadPoolCallback methode wordt doorgegeven aan QueueUserWorkItem, waarmee een beschikbare thread in de pool wordt toegewezen om de methode uit te voeren.

Omdat elk Fibonacci object een semi-willekeurige waarde krijgt om te berekenen en omdat elke thread concurreert voor processortijd, kunt u niet vooraf weten hoe lang het duurt voordat alle vijf de resultaten worden berekend. Daarom wordt elk Fibonacci object tijdens de bouw doorgegeven aan een exemplaar van de ManualResetEvent klasse. Elk object geeft het opgegeven gebeurtenisobject aan wanneer de berekening is voltooid, waardoor de primaire thread de uitvoering WaitAll kan blokkeren totdat alle vijf Fibonacci objecten een resultaat hebben berekend. De Main methode geeft vervolgens elk Fibonacci resultaat weer.

using System;
using System.Threading;

public class Fibonacci
{
    private ManualResetEvent _doneEvent;

    public Fibonacci(int n, ManualResetEvent doneEvent)
    {
        N = n;
        _doneEvent = doneEvent;
    }

    public int N { get; }

    public int FibOfN { get; private set; }

    public void ThreadPoolCallback(Object threadContext)
    {
        int threadIndex = (int)threadContext;
        Console.WriteLine($"Thread {threadIndex} started...");
        FibOfN = Calculate(N);
        Console.WriteLine($"Thread {threadIndex} result calculated...");
        _doneEvent.Set();
    }

    public int Calculate(int n)
    {
        if (n <= 1)
        {
            return n;
        }
        return Calculate(n - 1) + Calculate(n - 2);
    }
}

public class ThreadPoolExample
{
    static void Main()
    {
        const int FibonacciCalculations = 5;

        var doneEvents = new ManualResetEvent[FibonacciCalculations];
        var fibArray = new Fibonacci[FibonacciCalculations];
        var rand = new Random();

        Console.WriteLine($"Launching {FibonacciCalculations} tasks...");
        for (int i = 0; i < FibonacciCalculations; i++)
        {
            doneEvents[i] = new ManualResetEvent(false);
            var f = new Fibonacci(rand.Next(20, 40), doneEvents[i]);
            fibArray[i] = f;
            ThreadPool.QueueUserWorkItem(f.ThreadPoolCallback, i);
        }

        WaitHandle.WaitAll(doneEvents);
        Console.WriteLine("All calculations are complete.");

        for (int i = 0; i < FibonacciCalculations; i++)
        {
            Fibonacci f = fibArray[i];
            Console.WriteLine($"Fibonacci({f.N}) = {f.FibOfN}");
        }
    }
}
// The output is similar to:
// Launching 5 tasks...
// Thread 3 started...
// Thread 4 started...
// Thread 2 started...
// Thread 1 started...
// Thread 0 started...
// Thread 2 result calculated...
// Thread 3 result calculated...
// Thread 4 result calculated...
// Thread 1 result calculated...
// Thread 0 result calculated...
// All calculations are complete.
// Fibonacci(35) = 9227465
// Fibonacci(27) = 196418
// Fibonacci(25) = 75025
// Fibonacci(25) = 75025
// Fibonacci(27) = 196418
Imports System.Threading

Public Class Fibonacci
    Private _doneEvent As ManualResetEvent

    Public Sub New(n As Integer, doneEvent As ManualResetEvent)
        Me.N = n
        _doneEvent = doneEvent
    End Sub

    Public ReadOnly Property N As Integer
    Public Property FibOfN As Integer

    Public Sub ThreadPoolCallback(threadContext As Object)
        Dim threadIndex As Integer = CType(threadContext, Integer)
        Console.WriteLine($"Thread {threadIndex} started...")
        FibOfN = Calculate(N)
        Console.WriteLine($"Thread {threadIndex} result calculated...")
        _doneEvent.Set()
    End Sub

    Public Function Calculate(n As Integer) As Integer
        If (n <= 1) Then
            Return n
        End If
        Return Calculate(n - 1) + Calculate(n - 2)
    End Function
End Class

Public Class ThreadPoolExample

    <MTAThread>
    Public Shared Sub Main()

        Const FibonacciCalculations As Integer = 5

        Dim doneEvents(FibonacciCalculations - 1) As ManualResetEvent
        Dim fibArray(FibonacciCalculations - 1) As Fibonacci
        Dim rand As Random = New Random()

        Console.WriteLine($"Launching {FibonacciCalculations} tasks...")

        For i As Integer = 0 To FibonacciCalculations - 1
            doneEvents(i) = New ManualResetEvent(False)
            Dim f As Fibonacci = New Fibonacci(rand.Next(20, 40), doneEvents(i))
            fibArray(i) = f
            ThreadPool.QueueUserWorkItem(AddressOf f.ThreadPoolCallback, i)
        Next

        WaitHandle.WaitAll(doneEvents)
        Console.WriteLine("All calculations are complete.")

        For i As Integer = 0 To FibonacciCalculations - 1
            Dim f As Fibonacci = fibArray(i)
            Console.WriteLine($"Fibonacci({f.N}) = {f.FibOfN}")
        Next
    End Sub
End Class
' Output is similar to
' Launching 5 tasks...
' Thread 1 started...
' Thread 2 started...
' Thread 3 started...
' Thread 4 started...
' Thread 0 started...
' Thread 4 result calculated...
' Thread 2 result calculated...
' Thread 3 result calculated...
' Thread 0 result calculated...
' Thread 1 result calculated...
' All calculations are complete.
' Fibonacci(37) = 24157817
' Fibonacci(38) = 39088169
' Fibonacci(29) = 514229
' Fibonacci(32) = 2178309
' Fibonacci(23) = 28657

Opmerkingen

Als voor de callback-methode complexe gegevens zijn vereist, kunt u een klasse definiƫren die de gegevens bevat.

Note

Visual Basic gebruikers de WaitCallback constructor weglaten en gewoon de operator AddressOf gebruiken bij het doorgeven van de callback-methode aan QueueUserWorkItem. Visual Basic roept automatisch de juiste gemachtigde constructor aan.

Zie ook

Van toepassing op

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

Hiermee wordt een methode in de wachtrij geplaatst die is opgegeven door een Action<T> gemachtigde voor uitvoering en worden gegevens geleverd die door de methode moeten worden gebruikt. De methode wordt uitgevoerd wanneer een threadpool-thread beschikbaar komt.

public:
generic <typename TState>
 static bool QueueUserWorkItem(Action<TState> ^ callBack, TState state, bool preferLocal);
public static bool QueueUserWorkItem<TState>(Action<TState> callBack, TState state, bool preferLocal);
static member QueueUserWorkItem : Action<'State> * 'State * bool -> bool
Public Shared Function QueueUserWorkItem(Of TState) (callBack As Action(Of TState), state As TState, preferLocal As Boolean) As Boolean

Type parameters

TState

Het type elementen van state.

Parameters

callBack
Action<TState>

Een Action<T> weergave van de methode die moet worden uitgevoerd.

state
TState

Een object met gegevens dat door de methode moet worden gebruikt.

preferLocal
Boolean

true liever het werkitem in een wachtrij plaatsen dicht bij de huidige thread; false om het werkitem liever in de wachtrij te plaatsen in de gedeelde wachtrij van de threadgroep.

Retouren

true als de methode in de wachtrij is geplaatst; NotSupportedException wordt gegenereerd als het werkitem niet in de wachtrij kan worden geplaatst.

Van toepassing op