ThreadPool.QueueUserWorkItem Methode
Definitie
Belangrijk
Bepaalde informatie heeft betrekking op een voorlopige productversie die aanzienlijk kan worden gewijzigd voordat deze wordt uitgebracht. Microsoft biedt geen enkele expliciete of impliciete garanties met betrekking tot de informatie die hier wordt verstrekt.
Een methode voor uitvoering in de wachtrij plaatsen. De methode wordt uitgevoerd wanneer een threadpool-thread beschikbaar komt.
Overloads
| Name | Description |
|---|---|
| QueueUserWorkItem(WaitCallback) |
Een methode voor uitvoering in de wachtrij plaatsen. De methode wordt uitgevoerd wanneer een threadpool-thread beschikbaar komt. |
| QueueUserWorkItem(WaitCallback, Object) |
Hiermee wordt een methode voor uitvoering in de wachtrij geplaatst en wordt een object opgegeven dat gegevens bevat die door de methode moeten worden gebruikt. De methode wordt uitgevoerd wanneer een threadpool-thread beschikbaar komt. |
| QueueUserWorkItem<TState>(Action<TState>, TState, Boolean) |
Hiermee wordt een methode in de wachtrij geplaatst die is opgegeven door een Action<T> gemachtigde voor uitvoering en worden gegevens geleverd die door de methode moeten worden gebruikt. De methode wordt uitgevoerd wanneer een threadpool-thread beschikbaar komt. |
QueueUserWorkItem(WaitCallback)
Een methode voor uitvoering in de wachtrij plaatsen. De methode wordt uitgevoerd wanneer een threadpool-thread beschikbaar komt.
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
Parameters
- callBack
- WaitCallback
Een WaitCallback die de methode vertegenwoordigt die moet worden uitgevoerd.
Retouren
true als de methode in de wachtrij is geplaatst; NotSupportedException wordt gegenereerd als het werkitem niet in de wachtrij kan worden geplaatst.
Uitzonderingen
callBack is null.
De Common Language Runtime (CLR) wordt gehost en de host biedt geen ondersteuning voor deze actie.
Voorbeelden
In het volgende voorbeeld wordt de overbelasting van de methode gebruikt om een taak in de QueueUserWorkItem(WaitCallback) wachtrij te plaatsen, die wordt vertegenwoordigd door de ThreadProc methode, om uit te voeren wanneer een thread beschikbaar wordt. Er wordt geen taakinformatie geleverd bij deze overbelasting. Daarom is de informatie die beschikbaar is voor de ThreadProc methode beperkt tot het object waartoe de methode behoort.
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.
Opmerkingen
U kunt gegevens die vereist zijn voor de methode in de wachtrij plaatsen in de instantievelden van de klasse waarin de methode is gedefinieerd, of u kunt de QueueUserWorkItem(WaitCallback, Object) overbelasting gebruiken die een object accepteert dat de benodigde gegevens bevat.
Note
Visual Basic gebruikers de WaitCallback constructor weglaten en gewoon de operator AddressOf gebruiken bij het doorgeven van de callback-methode aan QueueUserWorkItem. Visual Basic roept automatisch de juiste gemachtigde constructor aan.
De Thread.CurrentPrincipal eigenschapswaarde wordt doorgegeven aan werkthreads in de wachtrij met behulp van de QueueUserWorkItem methode.
Zie ook
Van toepassing op
QueueUserWorkItem(WaitCallback, Object)
Hiermee wordt een methode voor uitvoering in de wachtrij geplaatst en wordt een object opgegeven dat gegevens bevat die door de methode moeten worden gebruikt. De methode wordt uitgevoerd wanneer een threadpool-thread beschikbaar komt.
public:
static bool QueueUserWorkItem(System::Threading::WaitCallback ^ callBack, System::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
Parameters
- callBack
- WaitCallback
Een WaitCallback weergave van de methode die moet worden uitgevoerd.
- state
- Object
Een object met gegevens dat door de methode moet worden gebruikt.
Retouren
true als de methode in de wachtrij is geplaatst; NotSupportedException wordt gegenereerd als het werkitem niet in de wachtrij kan worden geplaatst.
Uitzonderingen
De Common Language Runtime (CLR) wordt gehost en de host biedt geen ondersteuning voor deze actie.
callBack is null.
Voorbeelden
In het volgende voorbeeld wordt de .NET threadpool gebruikt om het resultaat Fibonacci te berekenen voor vijf getallen tussen 20 en 40. Elk Fibonacci resultaat wordt weergegeven door de Fibonacci klasse, die een methode biedt die ThreadPoolCallback de berekening uitvoert. Er wordt een object gemaakt dat elke Fibonacci waarde vertegenwoordigt en de ThreadPoolCallback methode wordt doorgegeven aan QueueUserWorkItem, waarmee een beschikbare thread in de pool wordt toegewezen om de methode uit te voeren.
Omdat elk Fibonacci object een semi-willekeurige waarde krijgt om te berekenen en omdat elke thread concurreert voor processortijd, kunt u niet vooraf weten hoe lang het duurt voordat alle vijf de resultaten worden berekend. Daarom wordt elk Fibonacci object tijdens de bouw doorgegeven aan een exemplaar van de ManualResetEvent klasse. Elk object geeft het opgegeven gebeurtenisobject aan wanneer de berekening is voltooid, waardoor de primaire thread de uitvoering WaitAll kan blokkeren totdat alle vijf Fibonacci objecten een resultaat hebben berekend. De Main methode geeft vervolgens elk Fibonacci resultaat weer.
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
Opmerkingen
Als voor de callback-methode complexe gegevens zijn vereist, kunt u een klasse definiƫren die de gegevens bevat.
Note
Visual Basic gebruikers de WaitCallback constructor weglaten en gewoon de operator AddressOf gebruiken bij het doorgeven van de callback-methode aan QueueUserWorkItem. Visual Basic roept automatisch de juiste gemachtigde constructor aan.
Zie ook
Van toepassing op
QueueUserWorkItem<TState>(Action<TState>, TState, Boolean)
Hiermee wordt een methode in de wachtrij geplaatst die is opgegeven door een Action<T> gemachtigde voor uitvoering en worden gegevens geleverd die door de methode moeten worden gebruikt. De methode wordt uitgevoerd wanneer een threadpool-thread beschikbaar komt.
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
Type parameters
- TState
Het type elementen van state.
Parameters
- state
- TState
Een object met gegevens dat door de methode moet worden gebruikt.
- preferLocal
- Boolean
true liever het werkitem in een wachtrij plaatsen dicht bij de huidige thread; false om het werkitem liever in de wachtrij te plaatsen in de gedeelde wachtrij van de threadgroep.
Retouren
true als de methode in de wachtrij is geplaatst; NotSupportedException wordt gegenereerd als het werkitem niet in de wachtrij kan worden geplaatst.