ThreadPool.QueueUserWorkItem Metod
Definition
Viktigt
En del information gäller för förhandsversionen av en produkt och kan komma att ändras avsevärt innan produkten blir allmänt tillgänglig. Microsoft lämnar inga garantier, uttryckliga eller underförstådda, avseende informationen som visas här.
Köar en metod för körning. Metoden körs när en trådpoolstråd blir tillgänglig.
Överlagringar
| Name | Description |
|---|---|
| QueueUserWorkItem(WaitCallback) |
Köar en metod för körning. Metoden körs när en trådpoolstråd blir tillgänglig. |
| QueueUserWorkItem(WaitCallback, Object) |
Köar en metod för körning och anger ett objekt som innehåller data som ska användas av metoden. Metoden körs när en trådpoolstråd blir tillgänglig. |
| QueueUserWorkItem<TState>(Action<TState>, TState, Boolean) |
Köar en metod som anges av ett Action<T> ombud för körning och tillhandahåller data som ska användas av metoden. Metoden körs när en trådpoolstråd blir tillgänglig. |
QueueUserWorkItem(WaitCallback)
- Källa:
- ThreadPoolWorkQueue.cs
- Källa:
- ThreadPoolWorkQueue.cs
- Källa:
- ThreadPoolWorkQueue.cs
- Källa:
- ThreadPoolWorkQueue.cs
- Källa:
- ThreadPoolWorkQueue.cs
Köar en metod för körning. Metoden körs när en trådpoolstråd blir tillgänglig.
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
Parametrar
- callBack
- WaitCallback
En WaitCallback som representerar den metod som ska köras.
Returer
true om metoden har placerats i kö. NotSupportedException utlöses om arbetsobjektet inte kunde placeras i kö.
Undantag
callBack är null.
CLR (Common Language Runtime) finns och värden stöder inte den här åtgärden.
Exempel
I följande exempel används metodöverbelastningen QueueUserWorkItem(WaitCallback) för att köa en uppgift, som representeras av ThreadProc metoden, för att köra när en tråd blir tillgänglig. Ingen uppgiftsinformation tillhandahålls med den här överbelastningen. Därför är den information som är tillgänglig för ThreadProc metoden begränsad till det objekt som metoden tillhör.
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.
Kommentarer
Du kan placera data som krävs av den köade metoden i instansfälten i klassen där metoden definieras, eller så kan du använda överlagringen QueueUserWorkItem(WaitCallback, Object) som accepterar ett objekt som innehåller nödvändiga data.
Note
Visual Basic användare kan utelämna konstruktorn WaitCallback och helt enkelt använda operatorn AddressOf när de skickar återanropsmetoden till QueueUserWorkItem. Visual Basic anropar automatiskt rätt ombudskonstruktor.
Egenskapsvärdet Thread.CurrentPrincipal sprids till arbetstrådar i kö med hjälp av QueueUserWorkItem metoden .
Se även
Gäller för
QueueUserWorkItem(WaitCallback, Object)
- Källa:
- ThreadPoolWorkQueue.cs
- Källa:
- ThreadPoolWorkQueue.cs
- Källa:
- ThreadPoolWorkQueue.cs
- Källa:
- ThreadPoolWorkQueue.cs
- Källa:
- ThreadPoolWorkQueue.cs
Köar en metod för körning och anger ett objekt som innehåller data som ska användas av metoden. Metoden körs när en trådpoolstråd blir tillgänglig.
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
Parametrar
- callBack
- WaitCallback
En WaitCallback som representerar metoden som ska köras.
- state
- Object
Ett objekt som innehåller data som ska användas av metoden.
Returer
true om metoden har placerats i kö. NotSupportedException utlöses om arbetsobjektet inte kunde placeras i kö.
Undantag
CLR (Common Language Runtime) finns och värden stöder inte den här åtgärden.
callBack är null.
Exempel
I följande exempel används .NET trådpool för att beräkna resultatet Fibonacci för fem tal mellan 20 och 40. Varje Fibonacci resultat representeras av Fibonacci klassen, som tillhandahåller en metod med namnet ThreadPoolCallback som utför beräkningen. Ett objekt som representerar varje Fibonacci värde skapas och ThreadPoolCallback metoden skickas till QueueUserWorkItem, som tilldelar en tillgänglig tråd i poolen för att köra metoden.
Eftersom varje Fibonacci objekt ges ett semi-slumpmässigt värde för beräkning, och eftersom varje tråd konkurrerar om processortiden, kan du inte i förväg veta hur lång tid det tar för alla fem resultaten att beräknas. Därför skickas varje Fibonacci objekt en instans av klassen under konstruktionen ManualResetEvent . Varje objekt signalerar det angivna händelseobjektet när beräkningen är klar, vilket gör att den primära tråden kan blockera körning med WaitAll tills alla fem Fibonacci objekt har beräknat ett resultat. Metoden Main visar sedan varje Fibonacci resultat.
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
Kommentarer
Om motringningsmetoden kräver komplexa data kan du definiera att en klass ska innehålla data.
Note
Visual Basic användare kan utelämna konstruktorn WaitCallback och helt enkelt använda operatorn AddressOf när de skickar återanropsmetoden till QueueUserWorkItem. Visual Basic anropar automatiskt rätt ombudskonstruktor.
Se även
Gäller för
QueueUserWorkItem<TState>(Action<TState>, TState, Boolean)
- Källa:
- ThreadPoolWorkQueue.cs
- Källa:
- ThreadPoolWorkQueue.cs
- Källa:
- ThreadPoolWorkQueue.cs
- Källa:
- ThreadPoolWorkQueue.cs
- Källa:
- ThreadPoolWorkQueue.cs
Köar en metod som anges av ett Action<T> ombud för körning och tillhandahåller data som ska användas av metoden. Metoden körs när en trådpoolstråd blir tillgänglig.
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
Typparametrar
- TState
Typ av element i state.
Parametrar
- state
- TState
Ett objekt som innehåller data som ska användas av metoden.
- preferLocal
- Boolean
true att föredra att köa arbetsobjektet i en kö nära den aktuella tråden; false att föredra att köa arbetsobjektet till trådpoolens delade kö.
Returer
true om metoden har placerats i kö. NotSupportedException utlöses om arbetsobjektet inte kunde placeras i kö.