Freigeben über


ThreadPool.QueueUserWorkItem Methode

Definition

Stellt eine Methode für die Ausführung in die Warteschlange. Die Methode wird ausgeführt, wenn ein Threadpoolthread verfügbar wird.

Überlädt

Name Beschreibung
QueueUserWorkItem(WaitCallback)

Stellt eine Methode für die Ausführung in die Warteschlange. Die Methode wird ausgeführt, wenn ein Threadpoolthread verfügbar wird.

QueueUserWorkItem(WaitCallback, Object)

Stellt eine Methode für die Ausführung in die Warteschlange und gibt ein Objekt an, das Daten enthält, die von der Methode verwendet werden sollen. Die Methode wird ausgeführt, wenn ein Threadpoolthread verfügbar wird.

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

Stellt eine Methode in die Warteschlange, die von einem Action<T> Delegaten für die Ausführung angegeben wird, und stellt Daten bereit, die von der Methode verwendet werden sollen. Die Methode wird ausgeführt, wenn ein Threadpoolthread verfügbar wird.

QueueUserWorkItem(WaitCallback)

Quelle:
ThreadPoolWorkQueue.cs
Quelle:
ThreadPoolWorkQueue.cs
Quelle:
ThreadPoolWorkQueue.cs
Quelle:
ThreadPoolWorkQueue.cs
Quelle:
ThreadPoolWorkQueue.cs

Stellt eine Methode für die Ausführung in die Warteschlange. Die Methode wird ausgeführt, wenn ein Threadpoolthread verfügbar wird.

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

Parameter

callBack
WaitCallback

Ein WaitCallback Wert, der die auszuführende Methode darstellt.

Gibt zurück

true wenn die Methode erfolgreich in die Warteschlange gestellt wird; NotSupportedException wird ausgelöst, wenn die Arbeitsaufgabe nicht in die Warteschlange gestellt werden konnte.

Ausnahmen

callBack ist null.

Die Common Language Runtime (CLR) wird gehostet, und der Host unterstützt diese Aktion nicht.

Beispiele

Im folgenden Beispiel wird die QueueUserWorkItem(WaitCallback) Methodenüberladung verwendet, um eine Aufgabe in die Warteschlange zu stellen, die durch die ThreadProc Methode dargestellt wird, um auszuführen, wenn ein Thread verfügbar wird. Für diese Überladung werden keine Vorgangsinformationen bereitgestellt. Daher sind die informationen, die für die ThreadProc Methode verfügbar sind, auf das Objekt beschränkt, zu dem die Methode gehört.

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.

Hinweise

Sie können Daten, die von der Warteschlange-Methode benötigt werden, in den Instanzenfeldern der Klasse platzieren, in der die Methode definiert ist, oder Sie können die Überladung verwenden, die QueueUserWorkItem(WaitCallback, Object) ein Objekt akzeptiert, das die erforderlichen Daten enthält.

Hinweis

Visual Basic-Benutzer können den WaitCallback Konstruktor weglassen und einfach den AddressOf Operator verwenden, wenn die Rückrufmethode übergeben wird QueueUserWorkItem. Visual Basic ruft automatisch den richtigen Delegatkonstruktor auf.

Der Thread.CurrentPrincipal Eigenschaftswert wird mithilfe der Methode an Arbeitsthreads verteilt, die in die QueueUserWorkItem Warteschlange gestellt werden.

Weitere Informationen

Gilt für:

QueueUserWorkItem(WaitCallback, Object)

Quelle:
ThreadPoolWorkQueue.cs
Quelle:
ThreadPoolWorkQueue.cs
Quelle:
ThreadPoolWorkQueue.cs
Quelle:
ThreadPoolWorkQueue.cs
Quelle:
ThreadPoolWorkQueue.cs

Stellt eine Methode für die Ausführung in die Warteschlange und gibt ein Objekt an, das Daten enthält, die von der Methode verwendet werden sollen. Die Methode wird ausgeführt, wenn ein Threadpoolthread verfügbar wird.

public:
 static bool QueueUserWorkItem(System::Threading::WaitCallback ^ callBack, System::Object ^ state);
public static bool QueueUserWorkItem(System.Threading.WaitCallback callBack, 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

Parameter

callBack
WaitCallback

A WaitCallback representing the method to execute.

state
Object

Ein Objekt, das Daten enthält, die von der Methode verwendet werden sollen.

Gibt zurück

true wenn die Methode erfolgreich in die Warteschlange gestellt wird; NotSupportedException wird ausgelöst, wenn die Arbeitsaufgabe nicht in die Warteschlange gestellt werden konnte.

Ausnahmen

Die Common Language Runtime (CLR) wird gehostet, und der Host unterstützt diese Aktion nicht.

callBack ist null.

Beispiele

Im folgenden Beispiel wird der .NET-Threadpool verwendet, um das Fibonacci Ergebnis für fünf Zahlen zwischen 20 und 40 zu berechnen. Jedes Fibonacci Ergebnis wird durch die Fibonacci Klasse dargestellt, die eine Methode mit dem Namen ThreadPoolCallback bereitstellt, die die Berechnung durchführt. Ein Objekt, das jeden Fibonacci Wert darstellt, wird erstellt, und die ThreadPoolCallback Methode wird übergeben QueueUserWorkItem, an das ein verfügbarer Thread im Pool zugewiesen wird, um die Methode auszuführen.

Da jedem Fibonacci Objekt ein halb randomer Wert zur Berechnung zugewiesen wird und jeder Thread für die Prozessorzeit konkurrieren wird, können Sie nicht im Voraus wissen, wie lange es dauern wird, bis alle fünf Ergebnisse berechnet werden. Aus diesem Grund wird jedes Fibonacci Objekt während der Konstruktion eine Instanz der ManualResetEvent Klasse übergeben. Jedes Objekt signalisiert das bereitgestellte Ereignisobjekt, wenn die Berechnung abgeschlossen ist, wodurch der primäre Thread die Ausführung WaitAll blockieren kann, bis alle fünf Fibonacci Objekte ein Ergebnis berechnet haben. Die Main Methode zeigt dann jedes Fibonacci Ergebnis an.

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

Hinweise

Wenn für die Rückrufmethode komplexe Daten erforderlich sind, können Sie eine Klasse definieren, die die Daten enthält.

Hinweis

Visual Basic-Benutzer können den WaitCallback Konstruktor weglassen und einfach den AddressOf Operator verwenden, wenn die Rückrufmethode übergeben wird QueueUserWorkItem. Visual Basic ruft automatisch den richtigen Delegatkonstruktor auf.

Weitere Informationen

Gilt für:

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

Quelle:
ThreadPoolWorkQueue.cs
Quelle:
ThreadPoolWorkQueue.cs
Quelle:
ThreadPoolWorkQueue.cs
Quelle:
ThreadPoolWorkQueue.cs
Quelle:
ThreadPoolWorkQueue.cs

Stellt eine Methode in die Warteschlange, die von einem Action<T> Delegaten für die Ausführung angegeben wird, und stellt Daten bereit, die von der Methode verwendet werden sollen. Die Methode wird ausgeführt, wenn ein Threadpoolthread verfügbar wird.

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

Typparameter

TState

Der Typ der Elemente von state.

Parameter

callBack
Action<TState>

Eine Action<T> Darstellung der auszuführenden Methode.

state
TState

Ein Objekt, das Daten enthält, die von der Methode verwendet werden sollen.

preferLocal
Boolean

true die Warteschlange der Arbeitsaufgabe in einer Warteschlange in der Nähe des aktuellen Threads zu bevorzugen; false um es vorzuziehen, die Arbeitsaufgabe in die freigegebene Warteschlange des Threadpools einzureihen.

Gibt zurück

true wenn die Methode erfolgreich in die Warteschlange gestellt wird; NotSupportedException wird ausgelöst, wenn die Arbeitsaufgabe nicht in die Warteschlange gestellt werden konnte.

Gilt für: