Поделиться через


ThreadPool.QueueUserWorkItem Метод

Определение

Очереди метода для выполнения. Метод выполняется, когда поток пула потоков становится доступным.

Перегрузки

Имя Описание
QueueUserWorkItem(WaitCallback)

Очереди метода для выполнения. Метод выполняется, когда поток пула потоков становится доступным.

QueueUserWorkItem(WaitCallback, Object)

Помещает метод для выполнения и задает объект, содержащий данные, используемые методом. Метод выполняется, когда поток пула потоков становится доступным.

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

Очередь метода, указанного делегатом Action<T> для выполнения, и предоставляет данные, используемые методом. Метод выполняется, когда поток пула потоков становится доступным.

QueueUserWorkItem(WaitCallback)

Исходный код:
ThreadPoolWorkQueue.cs
Исходный код:
ThreadPoolWorkQueue.cs
Исходный код:
ThreadPoolWorkQueue.cs
Исходный код:
ThreadPoolWorkQueue.cs
Исходный код:
ThreadPoolWorkQueue.cs

Очереди метода для выполнения. Метод выполняется, когда поток пула потоков становится доступным.

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

Параметры

callBack
WaitCallback

Объект, WaitCallback представляющий выполняемый метод.

Возвращаемое значение

true Значение , если метод успешно поставлен в очередь; NotSupportedException вызывается, если рабочий элемент не может быть помещен в очередь.

Исключения

callBack равно null.

Среда CLR размещается, и узел не поддерживает это действие.

Примеры

В следующем примере используется перегрузка QueueUserWorkItem(WaitCallback) метода для очереди задачи, представленной методом ThreadProc , для выполнения при доступности потока. Сведения о задаче не предоставляются с этой перегрузкой. Поэтому сведения, доступные методу ThreadProc , ограничены объектом, к которому принадлежит метод.

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.

Комментарии

Данные, необходимые методу в очереди, можно поместить в поля экземпляра класса, в котором определен метод, или использовать QueueUserWorkItem(WaitCallback, Object) перегрузку, принимающую объект, содержащий необходимые данные.

Замечание

Пользователи Visual Basic могут опустить WaitCallback конструктор и просто использовать AddressOf оператор при передаче метода QueueUserWorkItemобратного вызова. Visual Basic автоматически вызывает правильный конструктор делегата.

Thread.CurrentPrincipal Значение свойства распространяется на рабочие потоки, в очереди с помощью QueueUserWorkItem метода.

См. также раздел

Применяется к

QueueUserWorkItem(WaitCallback, Object)

Исходный код:
ThreadPoolWorkQueue.cs
Исходный код:
ThreadPoolWorkQueue.cs
Исходный код:
ThreadPoolWorkQueue.cs
Исходный код:
ThreadPoolWorkQueue.cs
Исходный код:
ThreadPoolWorkQueue.cs

Помещает метод для выполнения и задает объект, содержащий данные, используемые методом. Метод выполняется, когда поток пула потоков становится доступным.

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

Параметры

callBack
WaitCallback

Объект, WaitCallback представляющий метод для выполнения.

state
Object

Объект, содержащий данные, используемые методом.

Возвращаемое значение

true Значение , если метод успешно поставлен в очередь; NotSupportedException вызывается, если рабочий элемент не может быть помещен в очередь.

Исключения

Среда CLR размещается, и узел не поддерживает это действие.

callBack равно null.

Примеры

В следующем примере пул потоков .NET используется для вычисления Fibonacci результата для пяти чисел от 20 до 40. Каждый Fibonacci результат представлен классом Fibonacci , который предоставляет метод с именем ThreadPoolCallback , который выполняет вычисление. Создается объект, представляющий каждое Fibonacci значение, и ThreadPoolCallback метод передается QueueUserWorkItem, который назначает доступный поток в пуле для выполнения метода.

Так как каждому объекту присваивается полуслучайное значение для вычислений, и так как каждый Fibonacci поток будет конкурировать за время процессора, вы не можете заранее знать, сколько времени потребуется для вычисления всех пяти результатов. Именно поэтому каждый Fibonacci объект передается экземпляр ManualResetEvent класса во время построения. Каждый объект сигнализирует предоставленному объекту события при завершении вычисления, что позволяет первичному потоку блокировать выполнение до WaitAll тех пор, пока все пять Fibonacci объектов не вычислили результат. Затем метод Main отображает каждый Fibonacci результат.

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

Комментарии

Если метод обратного вызова требует сложных данных, можно определить класс для хранения данных.

Замечание

Пользователи Visual Basic могут опустить WaitCallback конструктор и просто использовать AddressOf оператор при передаче метода QueueUserWorkItemобратного вызова. Visual Basic автоматически вызывает правильный конструктор делегата.

См. также раздел

Применяется к

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

Исходный код:
ThreadPoolWorkQueue.cs
Исходный код:
ThreadPoolWorkQueue.cs
Исходный код:
ThreadPoolWorkQueue.cs
Исходный код:
ThreadPoolWorkQueue.cs
Исходный код:
ThreadPoolWorkQueue.cs

Очередь метода, указанного делегатом Action<T> для выполнения, и предоставляет данные, используемые методом. Метод выполняется, когда поток пула потоков становится доступным.

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

Параметры типа

TState

Тип элементов state.

Параметры

callBack
Action<TState>

Объект, Action<T> представляющий метод для выполнения.

state
TState

Объект, содержащий данные, используемые методом.

preferLocal
Boolean

true , чтобы предпочесть очередь рабочего элемента в очереди, близкой к текущему потоку; false чтобы предпочесть очередь рабочего элемента в общую очередь пула потоков.

Возвращаемое значение

true Значение , если метод успешно поставлен в очередь; NotSupportedException вызывается, если рабочий элемент не может быть помещен в очередь.

Применяется к