ThreadPool.QueueUserWorkItem Yöntem
Tanım
Önemli
Bazı bilgiler ürünün ön sürümüyle ilgilidir ve sürüm öncesinde önemli değişiklikler yapılmış olabilir. Burada verilen bilgilerle ilgili olarak Microsoft açık veya zımni hiçbir garanti vermez.
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 state
türü.
Parametreler
- 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.