ThreadPool.QueueUserWorkItem メソッド
定義
重要
一部の情報は、リリース前に大きく変更される可能性があるプレリリースされた製品に関するものです。 Microsoft は、ここに記載されている情報について、明示または黙示を問わず、一切保証しません。
実行するメソッドをキューに入れます。 このメソッドは、スレッド プール スレッドが使用可能になったときに実行されます。
オーバーロード
| 名前 | 説明 |
|---|---|
| QueueUserWorkItem(WaitCallback) |
実行するメソッドをキューに入れます。 このメソッドは、スレッド プール スレッドが使用可能になったときに実行されます。 |
| QueueUserWorkItem(WaitCallback, Object) |
実行するメソッドをキューに入れ、メソッドで使用するデータを含むオブジェクトを指定します。 このメソッドは、スレッド プール スレッドが使用可能になったときに実行されます。 |
| QueueUserWorkItem<TState>(Action<TState>, TState, Boolean) |
Action<T> デリゲートによって指定されたメソッドをキューに入れ、メソッドで使用するデータを提供します。 このメソッドは、スレッド プール スレッドが使用可能になったときに実行されます。 |
QueueUserWorkItem(WaitCallback)
実行するメソッドをキューに入れます。 このメソッドは、スレッド プール スレッドが使用可能になったときに実行されます。
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
パラメーター
- callBack
- WaitCallback
実行するメソッドを表す WaitCallback 。
返品
true メソッドが正常にキューに入った場合。作業項目をキューに登録できなかった場合、 NotSupportedException がスローされます。
例外
callBack は nullです。
共通言語ランタイム (CLR) はホストされており、ホストはこのアクションをサポートしていません。
例
次の例では、 QueueUserWorkItem(WaitCallback) メソッドのオーバーロードを使用して、 ThreadProc メソッドで表されるタスクをキューに入れ、スレッドが使用可能になったときに実行します。 このオーバーロードでは、タスク情報は提供されません。 したがって、 ThreadProc メソッドで使用できる情報は、メソッドが属するオブジェクトに限定されます。
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.
注釈
キューに置かれたメソッドで必要なデータを、メソッドが定義されているクラスのインスタンス フィールドに配置することも、必要なデータを含むオブジェクトを受け入れる QueueUserWorkItem(WaitCallback, Object) オーバーロードを使用することもできます。
Note
Visual Basic ユーザーは、WaitCallback コンストラクターを省略し、コールバック メソッドをAddressOfに渡すときに QueueUserWorkItem 演算子を使用するだけです。 Visual Basic では、正しいデリゲート コンストラクターが自動的に呼び出されます。
Thread.CurrentPrincipal プロパティ値は、QueueUserWorkItem メソッドを使用してキューに登録されたワーカー スレッドに伝達されます。
こちらもご覧ください
適用対象
QueueUserWorkItem(WaitCallback, Object)
実行するメソッドをキューに入れ、メソッドで使用するデータを含むオブジェクトを指定します。 このメソッドは、スレッド プール スレッドが使用可能になったときに実行されます。
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
パラメーター
- callBack
- WaitCallback
実行するメソッドを表す WaitCallback 。
- state
- Object
メソッドによって使用されるデータを含むオブジェクト。
返品
true メソッドが正常にキューに入った場合。作業項目をキューに登録できなかった場合、 NotSupportedException がスローされます。
例外
共通言語ランタイム (CLR) はホストされており、ホストはこのアクションをサポートしていません。
callBack は nullです。
例
次の例では、.NET スレッド プールを使用して、20 から 40 までの 5 つの数値の Fibonacci 結果を計算します。 各Fibonacci結果は、計算を実行する Fibonacci という名前のメソッドを提供するThreadPoolCallback クラスによって表されます。 各 Fibonacci 値を表すオブジェクトが作成され、 ThreadPoolCallback メソッドが QueueUserWorkItemに渡され、プール内で使用可能なスレッドが割り当てられ、メソッドが実行されます。
各 Fibonacci オブジェクトには計算する半ランダム値が与えられ、各スレッドはプロセッサ時間を競合するため、5 つの結果すべてが計算されるまでの時間を事前に把握することはできません。 そのため、各 Fibonacci オブジェクトは、構築時に ManualResetEvent クラスのインスタンスを渡されます。 各オブジェクトは、計算が完了したときに指定されたイベント オブジェクトに通知します。これにより、5 つのWaitAll オブジェクトすべてが結果を計算するまで、プライマリ スレッドはFibonacciでの実行をブロックできます。 その後、 Main メソッドは各 Fibonacci 結果を表示します。
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
注釈
コールバック メソッドに複雑なデータが必要な場合は、データを格納するクラスを定義できます。
Note
Visual Basic ユーザーは、WaitCallback コンストラクターを省略し、コールバック メソッドをAddressOfに渡すときに QueueUserWorkItem 演算子を使用するだけです。 Visual Basic では、正しいデリゲート コンストラクターが自動的に呼び出されます。
こちらもご覧ください
適用対象
QueueUserWorkItem<TState>(Action<TState>, TState, Boolean)
Action<T> デリゲートによって指定されたメソッドをキューに入れ、メソッドで使用するデータを提供します。 このメソッドは、スレッド プール スレッドが使用可能になったときに実行されます。
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
型パラメーター
- TState
stateの要素の型。
パラメーター
- state
- TState
メソッドによって使用されるデータを含むオブジェクト。
- preferLocal
- Boolean
true 現在のスレッドに近いキュー内の作業項目をキューに入れます。作業項目をスレッド プールの共有キューにキューに入れます false 。
返品
true メソッドが正常にキューに入った場合。作業項目をキューに登録できなかった場合、 NotSupportedException がスローされます。