ThreadPool.QueueUserWorkItem Yöntem

Tanım

Yürütme için bir yöntemi kuyruğa alır. bir iş parçacığı havuzu iş parçacığı kullanılabilir olduğunda yöntemi yürütülür.

Aşırı Yüklemeler

QueueUserWorkItem(WaitCallback)

Yürütme için bir yöntemi kuyruğa alır. bir iş parçacığı havuzu iş parçacığı kullanılabilir olduğunda yöntemi yürütülür.

QueueUserWorkItem(WaitCallback, Object)

Yürütme için bir yöntemi kuyruğa alır ve yöntemi tarafından kullanılacak verileri içeren bir nesneyi belirtir. bir iş parçacığı havuzu iş parçacığı kullanılabilir olduğunda yöntemi yürütülür.

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

Yürütme için bir temsilci tarafından belirtilen bir Action<T> yöntemi kuyruğa alır ve yöntemi tarafından kullanılacak verileri sağlar. bir iş parçacığı havuzu iş parçacığı kullanılabilir olduğunda yöntemi yürütülür.

QueueUserWorkItem(WaitCallback)

Kaynak:
ThreadPoolWorkQueue.cs
Kaynak:
ThreadPoolWorkQueue.cs
Kaynak:
ThreadPoolWorkQueue.cs

Yürütme için bir yöntemi kuyruğa alır. bir iş parçacığı havuzu iş parçacığı kullanılabilir olduğunda yöntemi yürütülür.

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

Parametreler

callBack
WaitCallback

WaitCallback Yürütülecek yöntemi temsil eden bir.

Döndürülenler

true yöntem başarıyla kuyruğa alındıysa; NotSupportedException iş öğesi kuyruğa alınamadıysa oluşturulur.

Özel durumlar

callBack, null değeridir.

Ortak dil çalışma zamanı (CLR) barındırılır ve konak bu eylemi desteklemez.

Örnekler

Aşağıdaki örnek, bir iş parçacığı kullanılabilir olduğunda yürütülmek üzere yöntemiyle ThreadProc temsil edilen bir görevi kuyruğa almak için aşırı yükleme yöntemini kullanırQueueUserWorkItem(WaitCallback). Bu aşırı yüklemeyle birlikte hiçbir görev bilgisi sağlanmaz. Bu nedenle, yöntemi için ThreadProc kullanılabilir bilgiler yöntemin ait olduğu nesne ile sınırlıdır.

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.

Açıklamalar

Kuyruğa alınan yöntemin gerektirdiği verileri, yönteminin tanımlandığı sınıfın örnek alanlarına yerleştirebilir veya gerekli verileri içeren bir nesneyi kabul eden aşırı yüklemeyi kullanabilirsiniz QueueUserWorkItem(WaitCallback, Object) .

Not

Visual Basic kullanıcıları oluşturucuyu WaitCallback atlayabilir ve geri çağırma yöntemini QueueUserWorkItemöğesine geçirirken yalnızca işlecini kullanabilirAddressOf. Visual Basic otomatik olarak doğru temsilci oluşturucuyu çağırır.

Özellik Thread.CurrentPrincipal değeri, yöntemi kullanılarak kuyruğa alınan çalışan iş parçacıklarına QueueUserWorkItem yayılır.

Ayrıca bkz.

Şunlara uygulanır

QueueUserWorkItem(WaitCallback, Object)

Kaynak:
ThreadPoolWorkQueue.cs
Kaynak:
ThreadPoolWorkQueue.cs
Kaynak:
ThreadPoolWorkQueue.cs

Yürütme için bir yöntemi kuyruğa alır ve yöntemi tarafından kullanılacak verileri içeren bir nesneyi belirtir. bir iş parçacığı havuzu iş parçacığı kullanılabilir olduğunda yöntemi yürütülür.

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

Parametreler

callBack
WaitCallback

WaitCallback Yürütülecek yöntemi temsil eden bir.

state
Object

yöntemi tarafından kullanılacak verileri içeren bir nesne.

Döndürülenler

true yöntem başarıyla kuyruğa alındıysa; NotSupportedException iş öğesi kuyruğa alınamadıysa oluşturulur.

Özel durumlar

Ortak dil çalışma zamanı (CLR) barındırılır ve konak bu eylemi desteklemez.

callBack, null değeridir.

Örnekler

Aşağıdaki örnek, 20 ile 40 arasında beş sayının Fibonacci sonucunu hesaplamak için .NET iş parçacığı havuzunu kullanır. Her Fibonacci sonuç, hesaplamayı Fibonacci gerçekleştiren adlı ThreadPoolCallback bir yöntem sağlayan sınıfı tarafından temsil edilir. Her Fibonacci değeri temsil eden bir nesne oluşturulur ve ThreadPoolCallback yöntemi, yöntemini yürütmek için QueueUserWorkItemhavuzda kullanılabilir bir iş parçacığı atayan öğesine geçirilir.

Her Fibonacci nesneye işlem için yarı rastgele bir değer verildiği ve her iş parçacığının işlemci süresi için rekabet edeceği için beş sonucun da hesaplanması için ne kadar süreceğini önceden bilemezsiniz. Bu nedenle her Fibonacci nesne, oluşturma sırasında sınıfın bir örneğine ManualResetEvent geçirilir. Her nesne, hesaplaması tamamlandığında sağlanan olay nesnesine sinyal gönderir ve bu da birincil iş parçacığının beş Fibonacci nesnenin tümü bir sonuç hesaplayana kadar yürütmeyi WaitAll engellemesine olanak tanır. Yöntemi Main daha sonra her Fibonacci sonucu görüntüler.

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

Açıklamalar

Geri çağırma yöntemi karmaşık veriler gerektiriyorsa, verileri içerecek bir sınıf tanımlayabilirsiniz.

Not

Visual Basic kullanıcıları oluşturucuyu WaitCallback atlayabilir ve geri çağırma yöntemini QueueUserWorkItemöğesine geçirirken yalnızca işlecini kullanabilirAddressOf. Visual Basic otomatik olarak doğru temsilci oluşturucuyu çağırır.

Ayrıca bkz.

Şunlara uygulanır

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

Kaynak:
ThreadPoolWorkQueue.cs
Kaynak:
ThreadPoolWorkQueue.cs
Kaynak:
ThreadPoolWorkQueue.cs

Yürütme için bir temsilci tarafından belirtilen bir Action<T> yöntemi kuyruğa alır ve yöntemi tarafından kullanılacak verileri sağlar. bir iş parçacığı havuzu iş parçacığı kullanılabilir olduğunda yöntemi yürütülür.

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

Tür Parametreleri

TState

öğelerinin statetürü.

Parametreler

callBack
Action<TState>

Action<T> Yürütülecek yöntemi temsil eden.

state
TState

yöntemi tarafından kullanılacak verileri içeren bir nesne.

preferLocal
Boolean

true iş öğesini geçerli iş parçacığına yakın bir kuyrukta kuyruğa almak; false iş öğesini iş parçacığı havuzunun paylaşılan kuyruğuna kuyruğa almak.

Döndürülenler

true yöntem başarıyla kuyruğa alındıysa; NotSupportedException iş öğesi kuyruğa alınamadıysa oluşturulur.

Şunlara uygulanır