다음을 통해 공유


ThreadPool.QueueUserWorkItem 메서드

정의

실행을 위해 메서드를 큐에 대기합니다. 스레드 풀 스레드를 사용할 수 있게 되면 메서드가 실행됩니다.

오버로드

Name Description
QueueUserWorkItem(WaitCallback)

실행을 위해 메서드를 큐에 대기합니다. 스레드 풀 스레드를 사용할 수 있게 되면 메서드가 실행됩니다.

QueueUserWorkItem(WaitCallback, Object)

실행을 위해 메서드를 큐에 대기하고 메서드에서 사용할 데이터가 포함된 개체를 지정합니다. 스레드 풀 스레드를 사용할 수 있게 되면 메서드가 실행됩니다.

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

대리자가 지정한 메서드를 Action<T> 실행하기 위해 큐에 대기하고 메서드에서 사용할 데이터를 제공합니다. 스레드 풀 스레드를 사용할 수 있게 되면 메서드가 실행됩니다.

QueueUserWorkItem(WaitCallback)

Source:
ThreadPoolWorkQueue.cs
Source:
ThreadPoolWorkQueue.cs
Source:
ThreadPoolWorkQueue.cs
Source:
ThreadPoolWorkQueue.cs
Source:
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 실행할 메서드를 나타내는 A입니다.

반환

메서드가 성공적으로 큐에 대기되면 이고, 는 작업 항목을 큐에 대기할 수 없는 경우 throw됩니다.

예외

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 하고 콜백 메서드QueueUserWorkItemAddressOf 전달할 때 연산자를 사용할 수 있습니다. Visual Basic은 올바른 대리자 생성자를 자동으로 호출합니다.

Thread.CurrentPrincipal 속성 값은 메서드를 사용하여 QueueUserWorkItem 큐에 대기 중인 작업자 스레드로 전파됩니다.

추가 정보

적용 대상

QueueUserWorkItem(WaitCallback, Object)

Source:
ThreadPoolWorkQueue.cs
Source:
ThreadPoolWorkQueue.cs
Source:
ThreadPoolWorkQueue.cs
Source:
ThreadPoolWorkQueue.cs
Source:
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

메서드에서 사용할 데이터가 들어 있는 개체입니다.

반환

메서드가 성공적으로 큐에 대기되면 이고, 는 작업 항목을 큐에 대기할 수 없는 경우 throw됩니다.

예외

CLR(공용 언어 런타임)이 호스트되고 호스트에서 이 작업을 지원하지 않습니다.

callBacknull입니다.

예제

다음 예제에서는 .NET 스레드 풀을 사용하여 20에서 Fibonacci 40 사이의 5개 숫자에 대한 결과를 계산합니다. 각 Fibonacci 결과는 계산을 Fibonacci 수행하는 명명 ThreadPoolCallback 된 메서드를 제공하는 클래스로 표시됩니다. 각 Fibonacci 값을 나타내는 개체가 만들어지고 ThreadPoolCallback 메서드가 전달되어 QueueUserWorkItem풀에서 사용 가능한 스레드를 할당하여 메서드를 실행합니다.

Fibonacci 개체에 계산할 반 임의 값이 부여되고 각 스레드가 프로세서 시간 동안 경쟁하기 때문에 5개 결과를 모두 계산하는 데 걸리는 시간을 미리 알 수 없습니다. 따라서 생성 중에 각 Fibonacci 개체가 클래스의 인스턴스를 ManualResetEvent 전달합니다. 각 개체는 계산이 완료되면 제공된 이벤트 개체를 신호로 표시하므로 5개의 Fibonacci 개체가 모두 결과를 계산할 때까지 주 스레드가 실행을 WaitAll 차단할 수 있습니다. 그런 다음 메서드는 MainFibonacci 결과를 표시합니다.

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 하고 콜백 메서드QueueUserWorkItemAddressOf 전달할 때 연산자를 사용할 수 있습니다. Visual Basic은 올바른 대리자 생성자를 자동으로 호출합니다.

추가 정보

적용 대상

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

Source:
ThreadPoolWorkQueue.cs
Source:
ThreadPoolWorkQueue.cs
Source:
ThreadPoolWorkQueue.cs
Source:
ThreadPoolWorkQueue.cs
Source:
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 스레드 풀의 공유 큐에 작업 항목을 큐에 대기하는 것을 선호합니다.

반환

메서드가 성공적으로 큐에 대기되면 이고, 는 작업 항목을 큐에 대기할 수 없는 경우 throw됩니다.

적용 대상