次の方法で共有


ThreadPool.QueueUserWorkItem メソッド

定義

実行するメソッドをキューに入れます。 このメソッドは、スレッド プール スレッドが使用可能になったときに実行されます。

オーバーロード

名前 説明
QueueUserWorkItem(WaitCallback)

実行するメソッドをキューに入れます。 このメソッドは、スレッド プール スレッドが使用可能になったときに実行されます。

QueueUserWorkItem(WaitCallback, Object)

実行するメソッドをキューに入れ、メソッドで使用するデータを含むオブジェクトを指定します。 このメソッドは、スレッド プール スレッドが使用可能になったときに実行されます。

QueueUserWorkItem<TState>(Action<TState>, TState, Boolean)

Action<T> デリゲートによって指定されたメソッドをキューに入れ、メソッドで使用するデータを提供します。 このメソッドは、スレッド プール スレッドが使用可能になったときに実行されます。

QueueUserWorkItem(WaitCallback)

ソース:
ThreadPoolWorkQueue.cs
ソース:
ThreadPoolWorkQueue.cs
ソース:
ThreadPoolWorkQueue.cs
ソース:
ThreadPoolWorkQueue.cs
ソース:
ThreadPoolWorkQueue.cs

実行するメソッドをキューに入れます。 このメソッドは、スレッド プール スレッドが使用可能になったときに実行されます。

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 がスローされます。

例外

callBacknullです。

共通言語ランタイム (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) オーバーロードを使用することもできます。

Visual Basic ユーザーは、WaitCallback コンストラクターを省略し、コールバック メソッドをQueueUserWorkItemに渡すときに AddressOf 演算子を使用するだけです。 Visual Basic では、正しいデリゲート コンストラクターが自動的に呼び出されます。

Thread.CurrentPrincipal プロパティ値は、QueueUserWorkItem メソッドを使用してキューに登録されたワーカー スレッドに伝達されます。

こちらもご覧ください

適用対象

QueueUserWorkItem(WaitCallback, Object)

ソース:
ThreadPoolWorkQueue.cs
ソース:
ThreadPoolWorkQueue.cs
ソース:
ThreadPoolWorkQueue.cs
ソース:
ThreadPoolWorkQueue.cs
ソース:
ThreadPoolWorkQueue.cs

実行するメソッドをキューに入れ、メソッドで使用するデータを含むオブジェクトを指定します。 このメソッドは、スレッド プール スレッドが使用可能になったときに実行されます。

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

パラメーター

callBack
WaitCallback

実行するメソッドを表す WaitCallback

state
Object

メソッドによって使用されるデータを含むオブジェクト。

戻り値

true メソッドが正常にキューに入った場合。作業項目をキューに登録できなかった場合、 NotSupportedException がスローされます。

例外

共通言語ランタイム (CLR) はホストされており、ホストはこのアクションをサポートしていません。

callBacknullです。

次の例では、.NET スレッド プールを使用して、20 から 40 までの 5 つの数値の Fibonacci 結果を計算します。 各Fibonacci結果は、計算を実行する ThreadPoolCallback という名前のメソッドを提供するFibonacci クラスによって表されます。 各 Fibonacci 値を表すオブジェクトが作成され、 ThreadPoolCallback メソッドが QueueUserWorkItemに渡され、プール内で使用可能なスレッドが割り当てられ、メソッドが実行されます。

Fibonacci オブジェクトには計算する半ランダム値が与えられ、各スレッドはプロセッサ時間を競合するため、5 つの結果すべてが計算されるまでの時間を事前に把握することはできません。 そのため、各 Fibonacci オブジェクトは、構築時に ManualResetEvent クラスのインスタンスを渡されます。 各オブジェクトは、計算が完了したときに指定されたイベント オブジェクトに通知します。これにより、5 つのFibonacci オブジェクトすべてが結果を計算するまで、プライマリ スレッドはWaitAllでの実行をブロックできます。 その後、 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

注釈

コールバック メソッドに複雑なデータが必要な場合は、データを格納するクラスを定義できます。

Visual Basic ユーザーは、WaitCallback コンストラクターを省略し、コールバック メソッドをQueueUserWorkItemに渡すときに AddressOf 演算子を使用するだけです。 Visual Basic では、正しいデリゲート コンストラクターが自動的に呼び出されます。

こちらもご覧ください

適用対象

QueueUserWorkItem<TState>(Action<TState>, TState, Boolean)

ソース:
ThreadPoolWorkQueue.cs
ソース:
ThreadPoolWorkQueue.cs
ソース:
ThreadPoolWorkQueue.cs
ソース:
ThreadPoolWorkQueue.cs
ソース:
ThreadPoolWorkQueue.cs

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の要素の型。

パラメーター

callBack
Action<TState>

実行するメソッドを表す Action<T>

state
TState

メソッドによって使用されるデータを含むオブジェクト。

preferLocal
Boolean

true 現在のスレッドに近いキュー内の作業項目をキューに入れます。作業項目をスレッド プールの共有キューにキューに入れます false

戻り値

true メソッドが正常にキューに入った場合。作業項目をキューに登録できなかった場合、 NotSupportedException がスローされます。

適用対象