英語で読む

次の方法で共有


ThreadPool.QueueUserWorkItem メソッド

定義

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

オーバーロード

QueueUserWorkItem(WaitCallback)

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

QueueUserWorkItem(WaitCallback, Object)

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

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

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

QueueUserWorkItem(WaitCallback)

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

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

C#
public static bool QueueUserWorkItem (System.Threading.WaitCallback callBack);

パラメーター

callBack
WaitCallback

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

戻り値

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

例外

callBacknull です。

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

次の例では、 メソッド オーバーロードを QueueUserWorkItem(WaitCallback) 使用して、 メソッドで表されるタスクを ThreadProc キューに入れ、スレッドが使用可能になったときに実行します。 このオーバーロードでは、タスク情報は指定されません。 したがって、メソッドで使用できる ThreadProc 情報は、メソッドが属するオブジェクトに限定されます。

C#
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.

注釈

キューに置かれたメソッドで必要なデータは、メソッドが定義されているクラスのインスタンス フィールドに配置することも、必要なデータを含むオブジェクトを受け入れるオーバーロードを使用 QueueUserWorkItem(WaitCallback, Object) することもできます。

注意

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

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

こちらもご覧ください

適用対象

.NET 9 およびその他のバージョン
製品 バージョン
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0, 2.1

QueueUserWorkItem(WaitCallback, Object)

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

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

C#
public static bool QueueUserWorkItem (System.Threading.WaitCallback callBack, object? state);
C#
public static bool QueueUserWorkItem (System.Threading.WaitCallback callBack, object state);

パラメーター

callBack
WaitCallback

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

state
Object

メソッドが使用するデータを格納したオブジェクト。

戻り値

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

例外

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

callBacknull です。

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

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

C#
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

注釈

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

注意

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

こちらもご覧ください

適用対象

.NET 9 およびその他のバージョン
製品 バージョン
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0, 2.1

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

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

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

C#
public static bool QueueUserWorkItem<TState> (Action<TState> callBack, TState state, bool preferLocal);

型パラメーター

TState

state の要素の型。

パラメーター

callBack
Action<TState>

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

state
TState

メソッドが使用するデータを格納したオブジェクト。

preferLocal
Boolean

現在のスレッドに近いキューに作業項目を入れる場合は true。スレッド プールの共有キューに作業項目を入れる場合は false

戻り値

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

適用対象

.NET 9 およびその他のバージョン
製品 バージョン
.NET Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Standard 2.1