ThreadPool.QueueUserWorkItem Método

Definição

Enfileira um método para execução.Queues a method for execution. O método é executado quando um thread de pool de threads se torna disponível.The method executes when a thread pool thread becomes available.

Sobrecargas

QueueUserWorkItem(WaitCallback)

Enfileira um método para execução.Queues a method for execution. O método é executado quando um thread de pool de threads se torna disponível.The method executes when a thread pool thread becomes available.

QueueUserWorkItem(WaitCallback, Object)

Enfileira um método para execução e especifica um objeto que contém dados a serem usados pelo método.Queues a method for execution, and specifies an object containing data to be used by the method. O método é executado quando um thread de pool de threads se torna disponível.The method executes when a thread pool thread becomes available.

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

Enfileira um método especificado por um delegado de Action<T> para execução e fornece os dados a serem usados pelo método.Queues a method specified by an Action<T> delegate for execution, and provides data to be used by the method. O método é executado quando um thread de pool de threads se torna disponível.The method executes when a thread pool thread becomes available.

QueueUserWorkItem(WaitCallback)

Enfileira um método para execução.Queues a method for execution. O método é executado quando um thread de pool de threads se torna disponível.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

Parâmetros

callBack
WaitCallback

Um WaitCallback que representa o método a ser executado.A WaitCallback that represents the method to be executed.

Retornos

Boolean

true se o método for colocado na fila com êxito; NotSupportedException será gerado se o item de trabalho não puder ser colocado na fila.true if the method is successfully queued; NotSupportedException is thrown if the work item could not be queued.

Exceções

callBack é null.callBack is null.

O CLR (Common Language Runtime) está hospedado e o host não dá suporte a essa ação.The common language runtime (CLR) is hosted, and the host does not support this action.

Exemplos

O exemplo a seguir usa a QueueUserWorkItem(WaitCallback) sobrecarga do método para enfileirar uma tarefa, que é representada pelo ThreadProc método, a ser executada quando um thread se tornar disponível.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. Nenhuma informação de tarefa é fornecida com essa sobrecarga.No task information is supplied with this overload. Portanto, as informações disponíveis para o ThreadProc método são limitadas ao objeto ao qual o método pertence.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.

Comentários

Você pode colocar os dados exigidos pelo método enfileirado nos campos de instância da classe na qual o método é definido ou pode usar a QueueUserWorkItem(WaitCallback, Object) sobrecarga que aceita um objeto que contém os dados necessários.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.

Observação

Visual Basic os usuários podem omitir o WaitCallback Construtor e simplesmente usar o AddressOf operador ao passar o método de retorno de chamada para QueueUserWorkItem .Visual Basic users can omit the WaitCallback constructor, and simply use the AddressOf operator when passing the callback method to QueueUserWorkItem. Visual Basic chama automaticamente o construtor delegado correto.Visual Basic automatically calls the correct delegate constructor.

Informações sobre versãoVersion Information

No .NET Framework versão 2,0, o Thread.CurrentPrincipal valor da propriedade é propagado para threads de trabalho na fila usando o QueueUserWorkItem método.In the .NET Framework version 2.0, the Thread.CurrentPrincipal property value is propagated to worker threads queued using the QueueUserWorkItem method. Em versões anteriores, as informações principais não são propagadas.In earlier versions, the principal information is not propagated.

Aplica-se a

QueueUserWorkItem(WaitCallback, Object)

Enfileira um método para execução e especifica um objeto que contém dados a serem usados pelo método.Queues a method for execution, and specifies an object containing data to be used by the method. O método é executado quando um thread de pool de threads se torna disponível.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);
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

Um WaitCallback que representa o método a ser executado.A WaitCallback representing the method to execute.

state
Object

Um objeto que contém dados a serem usados pelo método.An object containing data to be used by the method.

Retornos

Boolean

true se o método for colocado na fila com êxito; NotSupportedException será gerado se o item de trabalho não puder ser colocado na fila.true if the method is successfully queued; NotSupportedException is thrown if the work item could not be queued.

Exceções

O CLR (Common Language Runtime) está hospedado e o host não dá suporte a essa ação.The common language runtime (CLR) is hosted, and the host does not support this action.

callBack é null.callBack is null.

Exemplos

O exemplo a seguir usa o pool de threads .NET para calcular o Fibonacci resultado de cinco números entre 20 e 40.The following example uses the .NET thread pool to calculate the Fibonacci result for five numbers between 20 and 40. Cada resultado Fibonacci é representado pela classe Fibonacci, que fornece um método chamado ThreadPoolCallback que executa o cálculo.Each Fibonacci result is represented by the Fibonacci class, which provides a method named ThreadPoolCallback that performs the calculation. Um objeto que representa cada valor Fibonacci é criado e o método ThreadPoolCallback é passado para QueueUserWorkItem, que atribui um thread disponível no pool para executar o método.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.

Como cada Fibonacci objeto recebe um valor semialeatório para calcular e, como cada thread estará competindo pelo tempo do processador, você não poderá saber com antecedência quanto tempo levará para que todos os cinco resultados sejam calculados.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. É por isso que cada objeto Fibonacci é passado a uma instância da classe ManualResetEvent durante a construção.That is why each Fibonacci object is passed an instance of the ManualResetEvent class during construction. Cada objeto sinaliza o objeto de evento fornecido quando seu cálculo é concluído, o que permite que o thread primário bloqueie a execução WaitAll até que todos os cinco Fibonacci objetos tenham calculado um resultado.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. O método Main exibe então cada resultado de Fibonacci.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

Comentários

Se o método de retorno de chamada exigir dados complexos, você poderá definir uma classe para conter os dados.If the callback method requires complex data, you can define a class to contain the data.

Observação

Visual Basic os usuários podem omitir o WaitCallback Construtor e simplesmente usar o AddressOf operador ao passar o método de retorno de chamada para QueueUserWorkItem .Visual Basic users can omit the WaitCallback constructor, and simply use the AddressOf operator when passing the callback method to QueueUserWorkItem. Visual Basic chama automaticamente o construtor delegado correto.Visual Basic automatically calls the correct delegate constructor.

Informações sobre versãoVersion Information

No .NET Framework versão 2,0, o Thread.CurrentPrincipal valor da propriedade é propagado para threads de trabalho na fila usando o QueueUserWorkItem método.In the .NET Framework version 2.0, the Thread.CurrentPrincipal property value is propagated to worker threads queued using the QueueUserWorkItem method. Em versões anteriores, as informações principais não são propagadas.In earlier versions, the principal information is not propagated.

Aplica-se a

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

Enfileira um método especificado por um delegado de Action<T> para execução e fornece os dados a serem usados pelo método.Queues a method specified by an Action<T> delegate for execution, and provides data to be used by the method. O método é executado quando um thread de pool de threads se torna disponível.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

Parâmetros de tipo

TState

O tipo dos elementos de state.The type of elements of state.

Parâmetros

callBack
Action<TState>

Um Action<T> que representa o método a ser executado.An Action<T> representing the method to execute.

state
TState

Um objeto que contém dados a serem usados pelo método.An object containing data to be used by the method.

preferLocal
Boolean

true para indicar a preferência por colocar o item de trabalho em uma fila próximo ao thread atual; false para indicar a preferência por colocar o item de trabalho na fila compartilhada do pool de threads.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.

Retornos

Boolean

true se o método for colocado na fila com êxito; NotSupportedException será gerado se o item de trabalho não puder ser colocado na fila.true if the method is successfully queued; NotSupportedException is thrown if the work item could not be queued.

Aplica-se a