ThreadPool.QueueUserWorkItem ThreadPool.QueueUserWorkItem ThreadPool.QueueUserWorkItem ThreadPool.QueueUserWorkItem Method

定義

メソッドを実行するためのキューに置きます。Queues a method for execution. メソッドは、スレッド プール スレッドが使用可能になったときに実行されます。The method executes when a thread pool thread becomes available.

オーバーロード

QueueUserWorkItem(WaitCallback) QueueUserWorkItem(WaitCallback) QueueUserWorkItem(WaitCallback) QueueUserWorkItem(WaitCallback)

メソッドを実行するためのキューに置きます。Queues a method for execution. メソッドは、スレッド プール スレッドが使用可能になったときに実行されます。The method executes when a thread pool thread becomes available.

QueueUserWorkItem(WaitCallback, Object) QueueUserWorkItem(WaitCallback, Object) QueueUserWorkItem(WaitCallback, Object) QueueUserWorkItem(WaitCallback, Object)

実行するためのキューにメソッドを置き、そのメソッドが使用するデータを含んだオブジェクトを指定します。Queues a method for execution, and specifies an object containing data to be used by the method. メソッドは、スレッド プール スレッドが使用可能になったときに実行されます。The method executes when a thread pool thread becomes available.

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

実行用に Action<T> デリゲートで指定したメソッドをキューに入れ、メソッドで使うデータを指定します。Queues a method specified by an Action<T> delegate for execution, and provides data to be used by the method. メソッドは、スレッド プール スレッドが使用可能になったときに実行されます。The method executes when a thread pool thread becomes available.

QueueUserWorkItem(WaitCallback) QueueUserWorkItem(WaitCallback) QueueUserWorkItem(WaitCallback) QueueUserWorkItem(WaitCallback)

メソッドを実行するためのキューに置きます。Queues a method for execution. メソッドは、スレッド プール スレッドが使用可能になったときに実行されます。The method executes when a thread pool thread becomes available.

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 WaitCallback WaitCallback

実行するメソッドを表す WaitCallbackA WaitCallback that represents the method to be executed.

戻り値

メソッドが正常にキューに配置された場合は true。作業項目をキューに配置できなかった場合は NotSupportedException がスローされます。true if the method is successfully queued; NotSupportedException is thrown if the work item could not be queued.

例外

共通言語ランタイム (CLR) がホストされており、ホストではこのアクションがサポートされていません。The common language runtime (CLR) is hosted, and the host does not support this action.

次の例では、QueueUserWorkItem(WaitCallback)メソッドのオーバー ロードによって表される、タスクをキューに入れ、ThreadProcメソッドは、スレッドが使用可能なときに実行します。The following example uses the QueueUserWorkItem(WaitCallback) method overload to queue a task, which is represented by the ThreadProc method, to execute when a thread becomes available. このオーバー ロードでタスク情報が提供されていません。No task information is supplied with this overload. そのため、使用可能な情報、ThreadProcメソッドは、メソッドが属するオブジェクトに制限されます。Therefore, the information that is available to the ThreadProc method is limited to the object the method belongs to.

using namespace System;
using namespace System::Threading;

ref class Example
{
public:

   // This thread procedure performs the task.
   static void ThreadProc(Object^ stateInfo)
   {
      
      // No state object was passed to QueueUserWorkItem, so stateInfo is 0.
      Console::WriteLine( "Hello from the thread pool." );
   }
};

int main()
{
   // Queue the task.
   ThreadPool::QueueUserWorkItem(gcnew WaitCallback(Example::ThreadProc));

   Console::WriteLine("Main thread does some work, then sleeps.");
   
   Thread::Sleep(1000);
   Console::WriteLine("Main thread exits.");
   return 0;
}
// The example displays output like the following:
//       Main thread does some work, then sleeps.
//       Hello from the thread pool.
//       Main thread exits.
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)を必要なデータを格納するオブジェクトを受け入れるオーバー ロードします。You can place data required by the queued method in the instance fields of the class in which the method is defined, or you can use the QueueUserWorkItem(WaitCallback, Object) overload that accepts an object containing the necessary data.

注意

Visual Basic の場合は省略できます、WaitCallbackコンス トラクター、および使用して、AddressOf演算子にコールバック メソッドを渡すときにQueueUserWorkItemします。Visual Basic users can omit the WaitCallback constructor, and simply use the AddressOf operator when passing the callback method to QueueUserWorkItem. Visual Basic は、自動的に適切なデリゲート コンス トラクターを呼び出します。Visual Basic automatically calls the correct delegate constructor.

バージョン情報Version Information

.NET Framework version 2.0 で、Thread.CurrentPrincipalプロパティの値はワーカー スレッドに反映を使用してキューに置かれた、QueueUserWorkItemメソッド。In the .NET Framework version 2.0, the Thread.CurrentPrincipal property value is propagated to worker threads queued using the QueueUserWorkItem method. 以前のバージョンでは、プリンシパルの情報は反映されません。In earlier versions, the principal information is not propagated.

こちらもご覧ください

QueueUserWorkItem(WaitCallback, Object) QueueUserWorkItem(WaitCallback, Object) QueueUserWorkItem(WaitCallback, Object) QueueUserWorkItem(WaitCallback, Object)

実行するためのキューにメソッドを置き、そのメソッドが使用するデータを含んだオブジェクトを指定します。Queues a method for execution, and specifies an object containing data to be used by the method. メソッドは、スレッド プール スレッドが使用可能になったときに実行されます。The method executes when a thread pool thread becomes available.

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 WaitCallback WaitCallback

実行するメソッドを表す WaitCallbackA WaitCallback representing the method to execute.

state
Object Object Object Object

メソッドが使用するデータを格納したオブジェクト。An object containing data to be used by the method.

戻り値

メソッドが正常にキューに配置された場合は true。作業項目をキューに配置できなかった場合は NotSupportedException がスローされます。true if the method is successfully queued; NotSupportedException is thrown if the work item could not be queued.

例外

共通言語ランタイム (CLR) がホストされており、ホストではこのアクションがサポートされていません。The common language runtime (CLR) is hosted, and the host does not support this action.

次の例では、.NET スレッド プールを使用して計算する、 Fibonacci 20 ~ 40 の間の 5 つの数値の結果。The following example uses the .NET thread pool to calculate the Fibonacci result for five numbers between 20 and 40. Fibonacci の結果は Fibonacci クラスによって表され、このクラスには計算を実行する ThreadPoolCallback という名前のメソッドがあります。Each Fibonacci result is represented by the Fibonacci class, which provides a method named ThreadPoolCallback that performs the calculation. Fibonacci の各値を表すオブジェクトが作成され、ThreadPoolCallback メソッドが QueueUserWorkItem に渡されます。このメソッドは、プール内の使用可能なスレッドを割り当てて、渡されたメソッドを実行します。An object that represents each Fibonacci value is created, and the ThreadPoolCallback method is passed to QueueUserWorkItem, which assigns an available thread in the pool to execute the method.

ため、各Fibonacciオブジェクトには、計算に準ランダムな値が指定し、各スレッドは、プロセッサ時間の競合は、ため、5 つすべての結果を計算するかかる事前にどれくらいの時間を知ることはできません。Because each Fibonacci object is given a semi-random value to compute, and because each thread will be competing for processor time, you cannot know in advance how long it will take for all five results to be calculated. そのため、各 Fibonacci オブジェクトには構築の間に ManualResetEvent クラスのインスタンスを渡されます。That is why each Fibonacci object is passed an instance of the ManualResetEvent class during construction. 各オブジェクトが指定されたイベント オブジェクトに通知と、計算が完了すると、これにより、プライマリ スレッドで実行をブロックWaitAllまで 5 つすべてFibonacciオブジェクトが、結果を計算します。Each object signals the provided event object when its calculation is complete, which allows the primary thread to block execution with WaitAll until all five Fibonacci objects have calculated a result. その後、Main メソッドは各 Fibonacci の結果を表示します。The Main method then displays each Fibonacci result.

using namespace System;
using namespace System::Threading;

public ref class Fibonacci
{
private:
	ManualResetEvent^ _doneEvent;

	int Calculate(int n)
	{
		if (n <= 1)
		{
			return n;
		}
		return Calculate(n - 1) + Calculate(n - 2);
	}

public:
	
	int ID;
	int N;
	int FibOfN;

	Fibonacci(int id, int n, ManualResetEvent^ doneEvent)
	{
		ID = id;
		N = n;
		_doneEvent = doneEvent;
	}

	void Calculate()
	{
		FibOfN = Calculate(N);
	}

	void SetDone()
	{
		_doneEvent->Set();
	}
};

public ref struct Example
{
public:

	static void ThreadProc(Object^ stateInfo)
	{
		Fibonacci^ f = dynamic_cast<Fibonacci^>(stateInfo);
		Console::WriteLine("Thread {0} started...", f->ID);
		f->Calculate();
		Console::WriteLine("Thread {0} result calculated...", f->ID);
		f->SetDone();
	}
};


void main()
{
	const int FibonacciCalculations = 5;

	array<ManualResetEvent^>^ doneEvents = gcnew array<ManualResetEvent^>(FibonacciCalculations);
	array<Fibonacci^>^ fibArray = gcnew array<Fibonacci^>(FibonacciCalculations);
	Random^ rand = gcnew Random();

	Console::WriteLine("Launching {0} tasks...", FibonacciCalculations);

	for (int i = 0; i < FibonacciCalculations; i++)
	{
		doneEvents[i] = gcnew ManualResetEvent(false);
		Fibonacci^ f = gcnew Fibonacci(i, rand->Next(20, 40), doneEvents[i]);
		fibArray[i] = f;
		ThreadPool::QueueUserWorkItem(gcnew WaitCallback(Example::ThreadProc), f);
	}

	WaitHandle::WaitAll(doneEvents);
	Console::WriteLine("All calculations are complete.");

	for (int i = 0; i < FibonacciCalculations; i++)
	{
		Fibonacci^ f = fibArray[i];
		Console::WriteLine("Fibonacci({0}) = {1}", f->N, f->FibOfN);
	}
}
// Output is similar to:
// Launching 5 tasks...
// Thread 3 started...
// Thread 2 started...
// Thread 1 started...
// Thread 0 started...
// Thread 4 started...
// Thread 4 result calculated...
// Thread 1 result calculated...
// Thread 2 result calculated...
// Thread 0 result calculated...
// Thread 3 result calculated...
// All calculations are complete.
// Fibonacci(30) = 832040
// Fibonacci(24) = 46368
// Fibonacci(26) = 121393
// Fibonacci(36) = 14930352
// Fibonacci(20) = 6765
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

注釈

コールバック メソッドは、複雑なデータを必要とする場合は、データを格納するクラスを定義することができます。If the callback method requires complex data, you can define a class to contain the data.

注意

Visual Basic の場合は省略できます、WaitCallbackコンス トラクター、および使用して、AddressOf演算子にコールバック メソッドを渡すときにQueueUserWorkItemします。Visual Basic users can omit the WaitCallback constructor, and simply use the AddressOf operator when passing the callback method to QueueUserWorkItem. Visual Basic は、自動的に適切なデリゲート コンス トラクターを呼び出します。Visual Basic automatically calls the correct delegate constructor.

バージョン情報Version Information

.NET Framework version 2.0 で、Thread.CurrentPrincipalプロパティの値はワーカー スレッドに反映を使用してキューに置かれた、QueueUserWorkItemメソッド。In the .NET Framework version 2.0, the Thread.CurrentPrincipal property value is propagated to worker threads queued using the QueueUserWorkItem method. 以前のバージョンでは、プリンシパルの情報は反映されません。In earlier versions, the principal information is not propagated.

こちらもご覧ください

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

実行用に Action<T> デリゲートで指定したメソッドをキューに入れ、メソッドで使うデータを指定します。Queues a method specified by an Action<T> delegate for execution, and provides data to be used by the method. メソッドは、スレッド プール スレッドが使用可能になったときに実行されます。The method executes when a thread pool thread becomes available.

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 の要素の型。The type of elements of state.

パラメーター

callBack
Action<TState>

実行するメソッドを表す Action<T>An Action<T> representing the method to execute.

state

メソッドが使用するデータを格納したオブジェクト。An object containing data to be used by the method.

preferLocal
Boolean Boolean Boolean Boolean

その他の QueueUserWorkItem メソッドとは異なり、グローバル スレッド プールではなくローカル スレッド プール内での実行が優先されます。Unlike other QueueUserWorkItem methods, prefer executing in the local thread pool and not the global thread pool.

戻り値

メソッドが正常にキューに配置された場合は true。作業項目をキューに配置できなかった場合は NotSupportedException がスローされます。true if the method is successfully queued; NotSupportedException is thrown if the work item could not be queued.

適用対象