Compartir por


ThreadPool.QueueUserWorkItem Método

Definición

Pone en cola un método para su ejecución. El método se ejecuta cuando un subproceso del grupo de subprocesos está disponible.

Sobrecargas

Nombre Description
QueueUserWorkItem(WaitCallback)

Pone en cola un método para su ejecución. El método se ejecuta cuando un subproceso del grupo de subprocesos está disponible.

QueueUserWorkItem(WaitCallback, Object)

Pone en cola un método para su ejecución y especifica un objeto que contiene datos que va a usar el método . El método se ejecuta cuando un subproceso del grupo de subprocesos está disponible.

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

Pone en cola un método especificado por un Action<T> delegado para su ejecución y proporciona datos que el método va a usar. El método se ejecuta cuando un subproceso del grupo de subprocesos está disponible.

QueueUserWorkItem(WaitCallback)

Source:
ThreadPoolWorkQueue.cs
Source:
ThreadPoolWorkQueue.cs
Source:
ThreadPoolWorkQueue.cs
Source:
ThreadPoolWorkQueue.cs
Source:
ThreadPoolWorkQueue.cs

Pone en cola un método para su ejecución. El método se ejecuta cuando un subproceso del grupo de subprocesos está disponible.

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

Parámetros

callBack
WaitCallback

WaitCallback que representa el método que se va a ejecutar.

Devoluciones

true si el método se pone en cola correctamente; NotSupportedException se produce si no se pudo poner en cola el elemento de trabajo.

Excepciones

callBack es null.

Common Language Runtime (CLR) está hospedado y el host no admite esta acción.

Ejemplos

En el ejemplo siguiente se usa la sobrecarga del QueueUserWorkItem(WaitCallback) método para poner en cola una tarea, representada por el ThreadProc método , para ejecutarse cuando un subproceso está disponible. No se proporciona información de tareas con esta sobrecarga. Por lo tanto, la información que está disponible para el ThreadProc método se limita al objeto al que pertenece el método.

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.

Comentarios

Puede colocar los datos requeridos por el método en cola en los campos de instancia de la clase en la que se define el método o puede usar la QueueUserWorkItem(WaitCallback, Object) sobrecarga que acepta un objeto que contiene los datos necesarios.

Nota:

Los usuarios de Visual Basic pueden omitir el WaitCallback constructor y simplemente usar el AddressOf operador al pasar el método de devolución de llamada a QueueUserWorkItem. Visual Basic llama automáticamente al constructor delegado correcto.

El Thread.CurrentPrincipal valor de la propiedad se propaga a los subprocesos de trabajo en cola mediante el QueueUserWorkItem método .

Consulte también

Se aplica a

QueueUserWorkItem(WaitCallback, Object)

Source:
ThreadPoolWorkQueue.cs
Source:
ThreadPoolWorkQueue.cs
Source:
ThreadPoolWorkQueue.cs
Source:
ThreadPoolWorkQueue.cs
Source:
ThreadPoolWorkQueue.cs

Pone en cola un método para su ejecución y especifica un objeto que contiene datos que va a usar el método . El método se ejecuta cuando un subproceso del grupo de subprocesos está disponible.

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

Parámetros

callBack
WaitCallback

WaitCallback que representa el método que se va a ejecutar.

state
Object

Objeto que contiene datos que va a usar el método .

Devoluciones

true si el método se pone en cola correctamente; NotSupportedException se produce si no se pudo poner en cola el elemento de trabajo.

Excepciones

Common Language Runtime (CLR) está hospedado y el host no admite esta acción.

callBack es null.

Ejemplos

En el ejemplo siguiente se usa el grupo de subprocesos de .NET para calcular el Fibonacci resultado de cinco números entre 20 y 40. Cada Fibonacci resultado se representa mediante la Fibonacci clase , que proporciona un método denominado ThreadPoolCallback que realiza el cálculo. Se crea un objeto que representa cada Fibonacci valor y el ThreadPoolCallback método se pasa a QueueUserWorkItem, que asigna un subproceso disponible en el grupo para ejecutar el método .

Dado que a cada Fibonacci objeto se le asigna un valor semialeamio para calcular y, dado que cada subproceso competirá por el tiempo del procesador, no puede saber con antelación cuánto tiempo tardarán en calcularse los cinco resultados. Es por eso que cada Fibonacci objeto se pasa una instancia de la clase durante la ManualResetEvent construcción. Cada objeto indica al objeto de evento proporcionado cuando se completa su cálculo, lo que permite que el subproceso principal bloquee la ejecución con WaitAll hasta que los cinco Fibonacci objetos hayan calculado un resultado. A continuación, el Main método muestra cada Fibonacci resultado.

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

Comentarios

Si el método de devolución de llamada requiere datos complejos, puede definir una clase para que contenga los datos.

Nota:

Los usuarios de Visual Basic pueden omitir el WaitCallback constructor y simplemente usar el AddressOf operador al pasar el método de devolución de llamada a QueueUserWorkItem. Visual Basic llama automáticamente al constructor delegado correcto.

Consulte también

Se aplica a

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

Source:
ThreadPoolWorkQueue.cs
Source:
ThreadPoolWorkQueue.cs
Source:
ThreadPoolWorkQueue.cs
Source:
ThreadPoolWorkQueue.cs
Source:
ThreadPoolWorkQueue.cs

Pone en cola un método especificado por un Action<T> delegado para su ejecución y proporciona datos que el método va a usar. El método se ejecuta cuando un subproceso del grupo de subprocesos está disponible.

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

Parámetros de tipo

TState

Tipo de elementos de state.

Parámetros

callBack
Action<TState>

que Action<T> representa el método que se va a ejecutar.

state
TState

Objeto que contiene datos que va a usar el método .

preferLocal
Boolean

true para preferir poner en cola el elemento de trabajo en una cola cercana al subproceso actual; false para preferir poner en cola el elemento de trabajo a la cola compartida del grupo de subprocesos.

Devoluciones

true si el método se pone en cola correctamente; NotSupportedException se produce si no se pudo poner en cola el elemento de trabajo.

Se aplica a