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.

C#
public static bool QueueUserWorkItem (System.Threading.WaitCallback callBack);

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.

C#
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.

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

.NET 9 ve diğer sürümler
Ürün Sürümler
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0, 2.1

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.

C#
public static bool QueueUserWorkItem (System.Threading.WaitCallback callBack, object? state);
C#
public static bool QueueUserWorkItem (System.Threading.WaitCallback callBack, object state);

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.

C#
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

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

.NET 9 ve diğer sürümler
Ürün Sürümler
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0, 2.1

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.

C#
public static bool QueueUserWorkItem<TState> (Action<TState> callBack, TState state, bool preferLocal);

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

.NET 9 ve diğer sürümler
Ürün Sürümler
.NET Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Standard 2.1