ThreadPool.QueueUserWorkItem ThreadPool.QueueUserWorkItem ThreadPool.QueueUserWorkItem ThreadPool.QueueUserWorkItem Method

Definition

Fügt der Warteschlange eine auszuführende Methode hinzu.Queues a method for execution. Die Methode wird ausgeführt, wenn ein Thread des Threadpools verfügbar wird.The method executes when a thread pool thread becomes available.

Überlädt

QueueUserWorkItem(WaitCallback) QueueUserWorkItem(WaitCallback) QueueUserWorkItem(WaitCallback) QueueUserWorkItem(WaitCallback)

Fügt der Warteschlange eine auszuführende Methode hinzu.Queues a method for execution. Die Methode wird ausgeführt, wenn ein Thread des Threadpools verfügbar wird.The method executes when a thread pool thread becomes available.

QueueUserWorkItem(WaitCallback, Object) QueueUserWorkItem(WaitCallback, Object) QueueUserWorkItem(WaitCallback, Object) QueueUserWorkItem(WaitCallback, Object)

Fügt der Warteschlange eine auszuführende Methode hinzu und gibt ein Objekt an, das die von der Methode zu verwendenden Daten enthält.Queues a method for execution, and specifies an object containing data to be used by the method. Die Methode wird ausgeführt, wenn ein Thread des Threadpools verfügbar wird.The method executes when a thread pool thread becomes available.

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

Fügt der Warteschlange eine Methode hinzu, die von einem Action<T>-Delegat zur Ausführung angegeben wird, und stellt die von der Methode zu verwendenden Daten bereit.Queues a method specified by an Action<T> delegate for execution, and provides data to be used by the method. Die Methode wird ausgeführt, wenn ein Thread des Threadpools verfügbar wird.The method executes when a thread pool thread becomes available.

QueueUserWorkItem(WaitCallback) QueueUserWorkItem(WaitCallback) QueueUserWorkItem(WaitCallback) QueueUserWorkItem(WaitCallback)

Fügt der Warteschlange eine auszuführende Methode hinzu.Queues a method for execution. Die Methode wird ausgeführt, wenn ein Thread des Threadpools verfügbar wird.The method executes when a thread pool thread becomes available.

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

Ein WaitCallback, der die auszuführende Methode darstellt.A WaitCallback that represents the method to be executed.

Gibt zurück

true, wenn die Methode erfolgreich in die Warteschlange eingereiht wurde. NotSupportedException wird ausgelöst, wenn das Arbeitselement nicht in die Warteschlange eingereiht werden konnte.true if the method is successfully queued; NotSupportedException is thrown if the work item could not be queued.

Ausnahmen

Die Common Language Runtime (CLR) wird gehostet, und der Host unterstützt diese Aktion nicht.The common language runtime (CLR) is hosted, and the host does not support this action.

Beispiele

Im folgenden Beispiel wird die QueueUserWorkItem(WaitCallback)-Methoden Überladung verwendet, um eine Aufgabe, die durch die ThreadProc-Methode dargestellt wird, in die Warteschlange zu stellen, wenn ein Thread verfügbar wird.The following example uses the QueueUserWorkItem(WaitCallback) method overload to queue a task, which is represented by the ThreadProc method, to execute when a thread becomes available. Mit dieser Überladung werden keine Task Informationen bereitgestellt.No task information is supplied with this overload. Daher sind die Informationen, die für die ThreadProc-Methode verfügbar sind, auf das Objekt beschränkt, zu dem die Methode gehört.Therefore, the information that is available to the ThreadProc method is limited to the object the method belongs to.

using namespace System;
using namespace System::Threading;

ref class Example
{
public:

   // This thread procedure performs the task.
   static void ThreadProc(Object^ stateInfo)
   {
      
      // No state object was passed to QueueUserWorkItem, so stateInfo is 0.
      Console::WriteLine( "Hello from the thread pool." );
   }
};

int main()
{
   // Queue the task.
   ThreadPool::QueueUserWorkItem(gcnew WaitCallback(Example::ThreadProc));

   Console::WriteLine("Main thread does some work, then sleeps.");
   
   Thread::Sleep(1000);
   Console::WriteLine("Main thread exits.");
   return 0;
}
// The example displays output like the following:
//       Main thread does some work, then sleeps.
//       Hello from the thread pool.
//       Main thread exits.
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 in der Warteschlange befindlichen Methode benötigt werden, in die Instanzfelder der Klasse platzieren, in der die Methode definiert ist, oder Sie können die QueueUserWorkItem(WaitCallback, Object)-Überladung verwenden, die ein Objekt mit den erforderlichen Daten akzeptiert.You can place data required by the queued method in the instance fields of the class in which the method is defined, or you can use the QueueUserWorkItem(WaitCallback, Object) overload that accepts an object containing the necessary data.

Hinweis

Visual Basic Benutzer den WaitCallback-Konstruktor weglassen und einfach den AddressOf-Operator verwenden können, wenn die Rückruf Methode an QueueUserWorkItem übergeben wird.Visual Basic users can omit the WaitCallback constructor, and simply use the AddressOf operator when passing the callback method to QueueUserWorkItem. Visual Basic ruft automatisch den richtigen Delegatkonstruktor auf.Visual Basic automatically calls the correct delegate constructor.

VersionsinformationenVersion Information

In der .NET Framework Version 2,0 wird der Thread.CurrentPrincipal-Eigenschafts Wert mithilfe der QueueUserWorkItem-Methode an Arbeitsthreads weitergegeben, die in Warteschlangen eingereiht wurden.In the .NET Framework version 2.0, the Thread.CurrentPrincipal property value is propagated to worker threads queued using the QueueUserWorkItem method. In früheren Versionen werden die Prinzipal Informationen nicht weitergegeben.In earlier versions, the principal information is not propagated.

Siehe auch

QueueUserWorkItem(WaitCallback, Object) QueueUserWorkItem(WaitCallback, Object) QueueUserWorkItem(WaitCallback, Object) QueueUserWorkItem(WaitCallback, Object)

Fügt der Warteschlange eine auszuführende Methode hinzu und gibt ein Objekt an, das die von der Methode zu verwendenden Daten enthält.Queues a method for execution, and specifies an object containing data to be used by the method. Die Methode wird ausgeführt, wenn ein Thread des Threadpools verfügbar wird.The method executes when a thread pool thread becomes available.

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

Parameter

callBack
WaitCallback WaitCallback WaitCallback WaitCallback

Ein WaitCallback, der die auszuführende Methode darstellt.A WaitCallback representing the method to execute.

state
Object Object Object Object

Ein Objekt, das die von der Methode zu verwendenden Daten enthält.An object containing data to be used by the method.

Gibt zurück

true, wenn die Methode erfolgreich in die Warteschlange eingereiht wurde. NotSupportedException wird ausgelöst, wenn das Arbeitselement nicht in die Warteschlange eingereiht werden konnte.true if the method is successfully queued; NotSupportedException is thrown if the work item could not be queued.

Ausnahmen

Die Common Language Runtime (CLR) wird gehostet, und der Host unterstützt diese Aktion nicht.The common language runtime (CLR) is hosted, and the host does not support this action.

Beispiele

Im folgenden Beispiel wird der .net-Thread Pool verwendet, um das Ergebnis "Fibonacci" für fünf Zahlen zwischen 20 und 40 zu berechnen.The following example uses the .NET thread pool to calculate the Fibonacci result for five numbers between 20 and 40. Jedes Fibonacci-Ergebnis wird von der Fibonacci-Klasse repräsentiert, die eine Methode mit dem Namen ThreadPoolCallback bietet, die die Berechnung durchführt.Each Fibonacci result is represented by the Fibonacci class, which provides a method named ThreadPoolCallback that performs the calculation. Ein Objekt, das jeden Fibonacci-Wert repräsentiert, wird erstellt, und die ThreadPoolCallback-Methode wird an QueueUserWorkItem übergeben, das dem Pool einen verfügbaren Thread zuweist, um die Methode auszuführen.An object that represents each Fibonacci value is created, and the ThreadPoolCallback method is passed to QueueUserWorkItem, which assigns an available thread in the pool to execute the method.

Da jedem Fibonacci-Objekt ein halb zufälliger Wert zur Berechnung zugewiesen wird, und da 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.Because each Fibonacci object is given a semi-random value to compute, and because each thread will be competing for processor time, you cannot know in advance how long it will take for all five results to be calculated. Deshalb wird jedem Fibonacci-Objekt eine Instanz der ManualResetEvent-Klasse während der Konstruktion übergeben.That is why each Fibonacci object is passed an instance of the ManualResetEvent class during construction. Jedes-Objekt signalisiert dem bereitgestellten Ereignis Objekt, wenn die Berechnung vollständig ist. Dadurch kann der primäre Thread die Ausführung mit WaitAll blockieren, bis alle fünf Fibonacci-Objekte ein Ergebnis berechnet haben.Each object signals the provided event object when its calculation is complete, which allows the primary thread to block execution with WaitAll until all five Fibonacci objects have calculated a result. Die Main-Methode zeigt dann jedes Fibonacci-Ergebnis an.The Main method then displays each Fibonacci result.

using namespace System;
using namespace System::Threading;

public ref class Fibonacci
{
private:
    ManualResetEvent^ _doneEvent;

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

public:
    
    int ID;
    int N;
    int FibOfN;

    Fibonacci(int id, int n, ManualResetEvent^ doneEvent)
    {
        ID = id;
        N = n;
        _doneEvent = doneEvent;
    }

    void Calculate()
    {
        FibOfN = Calculate(N);
    }

    void SetDone()
    {
        _doneEvent->Set();
    }
};

public ref struct Example
{
public:

    static void ThreadProc(Object^ stateInfo)
    {
        Fibonacci^ f = dynamic_cast<Fibonacci^>(stateInfo);
        Console::WriteLine("Thread {0} started...", f->ID);
        f->Calculate();
        Console::WriteLine("Thread {0} result calculated...", f->ID);
        f->SetDone();
    }
};


void main()
{
    const int FibonacciCalculations = 5;

    array<ManualResetEvent^>^ doneEvents = gcnew array<ManualResetEvent^>(FibonacciCalculations);
    array<Fibonacci^>^ fibArray = gcnew array<Fibonacci^>(FibonacciCalculations);
    Random^ rand = gcnew Random();

    Console::WriteLine("Launching {0} tasks...", FibonacciCalculations);

    for (int i = 0; i < FibonacciCalculations; i++)
    {
        doneEvents[i] = gcnew ManualResetEvent(false);
        Fibonacci^ f = gcnew Fibonacci(i, rand->Next(20, 40), doneEvents[i]);
        fibArray[i] = f;
        ThreadPool::QueueUserWorkItem(gcnew WaitCallback(Example::ThreadProc), f);
    }

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

    for (int i = 0; i < FibonacciCalculations; i++)
    {
        Fibonacci^ f = fibArray[i];
        Console::WriteLine("Fibonacci({0}) = {1}", f->N, f->FibOfN);
    }
}
// Output is similar to:
// Launching 5 tasks...
// Thread 3 started...
// Thread 2 started...
// Thread 1 started...
// Thread 0 started...
// Thread 4 started...
// Thread 4 result calculated...
// Thread 1 result calculated...
// Thread 2 result calculated...
// Thread 0 result calculated...
// Thread 3 result calculated...
// All calculations are complete.
// Fibonacci(30) = 832040
// Fibonacci(24) = 46368
// Fibonacci(26) = 121393
// Fibonacci(36) = 14930352
// Fibonacci(20) = 6765
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ückruf Methode komplexe Daten erforderlich sind, können Sie eine Klasse definieren, die die Daten enthält.If the callback method requires complex data, you can define a class to contain the data.

Hinweis

Visual Basic Benutzer den WaitCallback-Konstruktor weglassen und einfach den AddressOf-Operator verwenden können, wenn die Rückruf Methode an QueueUserWorkItem übergeben wird.Visual Basic users can omit the WaitCallback constructor, and simply use the AddressOf operator when passing the callback method to QueueUserWorkItem. Visual Basic ruft automatisch den richtigen Delegatkonstruktor auf.Visual Basic automatically calls the correct delegate constructor.

VersionsinformationenVersion Information

In der .NET Framework Version 2,0 wird der Thread.CurrentPrincipal-Eigenschafts Wert mithilfe der QueueUserWorkItem-Methode an Arbeitsthreads weitergegeben, die in Warteschlangen eingereiht wurden.In the .NET Framework version 2.0, the Thread.CurrentPrincipal property value is propagated to worker threads queued using the QueueUserWorkItem method. In früheren Versionen werden die Prinzipal Informationen nicht weitergegeben.In earlier versions, the principal information is not propagated.

Siehe auch

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

Fügt der Warteschlange eine Methode hinzu, die von einem Action<T>-Delegat zur Ausführung angegeben wird, und stellt die von der Methode zu verwendenden Daten bereit.Queues a method specified by an Action<T> delegate for execution, and provides data to be used by the method. Die Methode wird ausgeführt, wenn ein Thread des Threadpools verfügbar wird.The method executes when a thread pool thread becomes available.

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.The type of elements of state.

Parameter

callBack
Action<TState>

Eine Action<T>, die die auszuführende Methode darstellt.An Action<T> representing the method to execute.

state

Ein Objekt, das die von der Methode zu verwendenden Daten enthält.An object containing data to be used by the method.

preferLocal
Boolean Boolean Boolean Boolean

Mit true fügen Sie das Arbeitselement in eine Warteschlange in der Nähe des aktuellen Threads ein; false für das Einfügen des Arbeitselements in die vom Threadpool freigegebene Warteschlange.true to prefer queueing the work item in a queue close to the current thread; false to prefer queueing the work item to the thread pool's shared queue.

Gibt zurück

true, wenn die Methode erfolgreich in die Warteschlange eingereiht wurde. NotSupportedException wird ausgelöst, wenn das Arbeitselement nicht in die Warteschlange eingereiht werden konnte.true if the method is successfully queued; NotSupportedException is thrown if the work item could not be queued. sein..

Gilt für: