ThreadPool 클래스

정의

작업 실행, 작업 항목 게시, 비동기 I/O 처리, 다른 스레드 대신 기다리기 및 타이머 처리에 사용할 수 있는 스레드 풀을 제공합니다.Provides a pool of threads that can be used to execute tasks, post work items, process asynchronous I/O, wait on behalf of other threads, and process timers.

public ref class ThreadPool abstract sealed
public static class ThreadPool
type ThreadPool = class
Public Class ThreadPool
상속
ThreadPool

예제

다음 예제에서는 기본 애플리케이션 스레드 큐 라는 메서드 ThreadProc 대기한 1 초에 한 다음 종료 스레드 풀 스레드에서 실행 합니다.In the following example, the main application thread queues a method named ThreadProc to execute on a thread pool thread, sleeps for one second, and then exits. ThreadProc 메서드 단순히 메시지를 표시 합니다.The ThreadProc method simply displays a message.

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.

호출을 주석 처리 하는 경우는 Thread.Sleep 메서드는 스레드 풀 스레드에서 실행 되기 전에 메서드를 주 스레드를 종료 합니다.If you comment out the call to the Thread.Sleep method, the main thread exits before method runs on the thread pool thread. 스레드 풀에는 애플리케이션이 모든 포그라운드 스레드가 종료 된 경우 실행을 유지 하지 않는 백그라운드 스레드를 사용 합니다.The thread pool uses background threads, which do not keep the application running if all foreground threads have terminated. (이것이 경합 상태의 간단한 예입니다.)(This is a simple example of a race condition.)

설명

대부분의 애플리케이션 상당한 시간 대기 상태에서 이벤트가 발생 하기를 기다리는 소비 하는 스레드를 만듭니다.Many applications create threads that spend a great deal of time in the sleeping state, waiting for an event to occur. 다른 스레드는 대기 상태에 상태 정보를 업데이트 하거나 변경에 대해 폴링하는 데 주기적으로 활성화에 입력할 수 있습니다.Other threads might enter a sleeping state only to be awakened periodically to poll for a change or update status information. 스레드 풀을 사용 하면 시스템에 의해 관리 되는 작업자 스레드 풀을 사용 하 여 애플리케이션을 제공 하 여 스레드를 보다 효율적으로 사용할 수 있습니다.The thread pool enables you to use threads more efficiently by providing your application with a pool of worker threads that are managed by the system. 스레드 풀 스레드를 사용 하는 작업의 예는 다음과 같습니다.Examples of operations that use thread pool threads include the following:

  • 만들 때를 Task 또는 Task<TResult> 작업을 스레드 풀 스레드에서 실행 되도록 예약 되어 기본적으로 일부 작업을 비동기적으로 수행 하는 개체입니다.When you create a Task or Task<TResult> object to perform some task asynchronously, by default the task is scheduled to run on a thread pool thread.

  • 비동기 타이머 스레드 풀을 사용 합니다.Asynchronous timers use the thread pool. 스레드 풀에서 콜백을 실행 합니다 System.Threading.Timer 클래스에서 이벤트 발생 및는 System.Timers.Timer 클래스입니다.Thread pool threads execute callbacks from the System.Threading.Timer class and raise events from the System.Timers.Timer class.

  • 등록 된 대기 핸들을 사용 하는 경우는 시스템 스레드가 대기 핸들의 상태를 모니터링 합니다.When you use registered wait handles, a system thread monitors the status of the wait handles. 대기 작업이 완료 되 면 스레드 풀에서 작업자 스레드는 해당 하는 콜백 함수를 실행 합니다.When a wait operation completes, a worker thread from the thread pool executes the corresponding callback function.

  • 호출 하는 경우는 QueueUserWorkItem 스레드 풀 스레드에서 실행에 대 한 메서드를 큐 대기 하는 방법입니다.When you call the QueueUserWorkItem method to queue a method for execution on a thread pool thread. 메서드를 전달 하 여이 작업을 수행 하는 WaitCallback 위임 합니다.You do this by passing the method a WaitCallback delegate. 시그니처가 대리자The delegate has the signature

    void WaitCallback(Object state)  
    
    Sub WaitCallback(state As Object)  
    

    여기서 state 는 대리자가 사용할 데이터가 들어 있는 개체입니다.where state is an object that contains data to be used by the delegate. 호출 하 여 대리자에 전달할 수는 실제 데이터는 QueueUserWorkItem(WaitCallback, Object) 메서드.The actual data can be passed to the delegate by calling the QueueUserWorkItem(WaitCallback, Object) method.

참고

관리 되는 스레드 풀의 스레드는 백그라운드 스레드입니다.The threads in the managed thread pool are background threads. 즉, 해당 IsBackground 속성은 true합니다.That is, their IsBackground properties are true. 즉, 한 ThreadPool 스레드 모든 포그라운드 스레드가 종료 된 후 실행 중인 애플리케이션을 유지 하지 것입니다.This means that a ThreadPool thread will not keep an application running after all foreground threads have exited.

중요

스레드 풀이 스레드를 다시 사용하면 스레드 로컬 스토리지 또는 ThreadStaticAttribute 특성으로 표시된 필드의 데이터가 지워지지 않습니다.When the thread pool reuses a thread, it does not clear the data in thread local storage or in fields that are marked with the ThreadStaticAttribute attribute. 따라서 메서드가 스레드 로컬 스토리지 또는 ThreadStaticAttribute 특성으로 표시된 필드를 검사할 때 발견한 값은 스레드 풀 스레드의 이전 사용에서 남겨둘 수 있습니다.Therefore, when a method examines thread local storage or fields that are marked with the ThreadStaticAttribute attribute, the values it finds might be left over from an earlier use of the thread pool thread.

스레드 풀에 대기 작업과 관련 되지 않은 작업 항목을 대기 시킬 수 있습니다.You can also queue work items that are not related to a wait operation to the thread pool. 작업 항목을 스레드 풀 스레드에 의해 처리 될 요청을 호출 합니다 QueueUserWorkItem 메서드.To request that a work item be handled by a thread in the thread pool, call the QueueUserWorkItem method. 이 메서드는 메서드 또는 스레드 풀에서 선택한 스레드에서 호출 될 대리자에 대 한 참조를 매개 변수로 사용 합니다.This method takes as a parameter a reference to the method or delegate that will be called by the thread selected from the thread pool. 이 대기 후 작업 항목을 취소 하는 방법이 있습니다.There is no way to cancel a work item after it has been queued.

타이머 큐 타이머 및 등록 된 대기 작업 스레드 풀을 사용 합니다.Timer-queue timers and registered wait operations also use the thread pool. 해당 콜백 함수는 스레드 풀에 대기 됩니다.Their callback functions are queued to the thread pool.

프로세스당 하나의 스레드 풀이 있습니다.There is one thread pool per process. .NET Framework 4.NET Framework 4부터 프로세스에 대한 스레드 풀의 기본 크기는 가상 주소 공간의 크기와 같은 여러 요인에 따라 달라집니다.Beginning with the .NET Framework 4.NET Framework 4, the default size of the thread pool for a process depends on several factors, such as the size of the virtual address space. 프로세스에서 GetMaxThreads 메서드를 호출하여 스레드 수를 확인할 수 있습니다.A process can call the GetMaxThreads method to determine the number of threads. 사용 하 여 스레드 풀의 스레드 수를 변경할 수 있습니다는 SetMaxThreads 메서드.The number of threads in the thread pool can be changed by using the SetMaxThreads method. 기본 스택 크기를 사용 하 고 기본 우선 순위로 실행 하는 각 스레드입니다.Each thread uses the default stack size and runs at the default priority.

참고

.NET Framework를 호스트 하는 관리 되지 않는 코드를 사용 하 여 스레드 풀의 크기를 변경할 수는 CorSetMaxThreads mscoree.h 파일에 정의 된 함수입니다.Unmanaged code that hosts the .NET Framework can change the size of the thread pool by using the CorSetMaxThreads function, defined in the mscoree.h file.

스레드 풀은 각 범주에 대 한 최소값에 도달할 때까지 주문형 새 작업자 스레드 또는 I/O 완료 스레드를 만듭니다.The thread pool provides new worker threads or I/O completion threads on demand until it reaches the minimum for each category. 최소에 도달 하면 스레드 풀 해당 범주에 추가 스레드를 만들 수도 있고 일부 작업이 완료 될 때까지 기다립니다.When a minimum is reached, the thread pool can create additional threads in that category or wait until some tasks complete. .NET Framework 4.NET Framework 4부터는 스레드 풀이 시간 단위당 완료되는 작업 수로 정의된 처리량을 최적화하기 위해 작업자 스레드를 만들고 소멸시킵니다.Beginning with the .NET Framework 4.NET Framework 4, the thread pool creates and destroys worker threads in order to optimize throughput, which is defined as the number of tasks that complete per unit of time. 스레드가 너무 적으면 사용 가능한 리소스가 효율적으로 사용되지 않는 반면, 너무 많으면 리소스 경합이 증가할 수 있습니다.Too few threads might not make optimal use of available resources, whereas too many threads could increase resource contention.

참고

요구가 적을 때는 실제 스레드 풀 스레드 수가 최소값보다 작을 수 있습니다.When demand is low, the actual number of thread pool threads can fall below the minimum values.

GetMinThreads 메서드를 사용하여 이러한 최소값을 가져올 수 있습니다.You can use the GetMinThreads method to obtain these minimum values.

주의

사용할 수는 SetMinThreads 스레드의 최소 수를 늘리려면 메서드.You can use the SetMinThreads method to increase the minimum number of threads. 그러나 이러한 값을 불필요하게 늘리면 성능 문제가 발생할 수 있습니다.However, unnecessarily increasing these values can cause performance problems. 너무 많은 작업이 동시에 시작되는 경우 모두 속도가 느린 것처럼 나타날 수 있습니다.If too many tasks start at the same time, all of them might appear to be slow. 대부분의 경우 스레드 풀은 고유한 스레드 할당 알고리즘에서 성능이 향상됩니다.In most cases the thread pool will perform better with its own algorithm for allocating threads.

속성

CompletedWorkItemCount

지금까지 처리된 작업 항목 수를 가져옵니다.Gets the number of work items that have been processed so far.

PendingWorkItemCount

현재 처리 대기 중인 작업 항목의 수를 가져옵니다.Gets the number of work items that are currently queued to be processed.

ThreadCount

현재 존재하는 스레드 풀 스레드의 수를 가져옵니다.Gets the number of thread pool threads that currently exist.

메서드

BindHandle(IntPtr)

ThreadPool에 운영 체제 핸들을 바인딩합니다.Binds an operating system handle to the ThreadPool.

BindHandle(SafeHandle)

ThreadPool에 운영 체제 핸들을 바인딩합니다.Binds an operating system handle to the ThreadPool.

GetAvailableThreads(Int32, Int32)

GetMaxThreads(Int32, Int32) 메서드에서 반환하는 최대 스레드 풀 스레드 수와 현재 활성 상태인 스레드 수의 차이를 검색합니다.Retrieves the difference between the maximum number of thread pool threads returned by the GetMaxThreads(Int32, Int32) method, and the number currently active.

GetMaxThreads(Int32, Int32)

동시에 활성 상태가 될 수 있는 스레드 풀에 대한 요청 수를 검색합니다.Retrieves the number of requests to the thread pool that can be active concurrently. 해당 개수를 초과하는 모든 요청은 스레드 풀 스레드가 사용 가능해질 때까지 큐에 대기 상태로 남아 있습니다.All requests above that number remain queued until thread pool threads become available.

GetMinThreads(Int32, Int32)

스레드 생성 및 소멸을 관리하기 위한 알고리즘으로 전환하기 전에 새 요청에 따라 스레드 풀이 만드는 스레드의 최소 개수를 검색합니다.Retrieves the minimum number of threads the thread pool creates on demand, as new requests are made, before switching to an algorithm for managing thread creation and destruction.

QueueUserWorkItem(WaitCallback)

실행을 위해 메서드를 큐에 대기시킵니다.Queues a method for execution. 이 메서드는 스레드 풀 스레드를 사용할 수 있을 때 실행됩니다.The method executes when a thread pool thread becomes available.

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)

실행을 위해 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.

RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, Int32, Boolean)

제한 시간(밀리초)에 부호 있는 32비트 정수를 지정하여 WaitHandle을 기다리는 대리자를 등록합니다.Registers a delegate to wait for a WaitHandle, specifying a 32-bit signed integer for the time-out in milliseconds.

RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, Int64, Boolean)

제한 시간(밀리초)에 부호 있는 64비트 정수를 지정하여 WaitHandle을 기다리는 대리자를 등록합니다.Registers a delegate to wait for a WaitHandle, specifying a 64-bit signed integer for the time-out in milliseconds.

RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, TimeSpan, Boolean)

제한 시간에 WaitHandle 값을 지정하여 TimeSpan을 기다리는 대리자를 등록합니다.Registers a delegate to wait for a WaitHandle, specifying a TimeSpan value for the time-out.

RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, UInt32, Boolean)

제한 시간(밀리초)에 부호 없는 32비트 정수를 지정하여 WaitHandle을 기다리는 대리자를 등록합니다.Registers a delegate to wait for a WaitHandle, specifying a 32-bit unsigned integer for the time-out in milliseconds.

SetMaxThreads(Int32, Int32)

동시에 활성 상태가 될 수 있는 스레드 풀에 대한 요청 수를 설정합니다.Sets the number of requests to the thread pool that can be active concurrently. 해당 개수를 초과하는 모든 요청은 스레드 풀 스레드가 사용 가능해질 때까지 큐에 대기 상태로 남아 있습니다.All requests above that number remain queued until thread pool threads become available.

SetMinThreads(Int32, Int32)

스레드 생성 및 소멸을 관리하기 위한 알고리즘으로 전환하기 전에 새 요청에 따라 스레드 풀이 만드는 스레드의 최소 개수를 설정합니다.Sets the minimum number of threads the thread pool creates on demand, as new requests are made, before switching to an algorithm for managing thread creation and destruction.

UnsafeQueueNativeOverlapped(NativeOverlapped*)

실행할 중첩된 I/O 작업을 큐에 대기시킵니다.Queues an overlapped I/O operation for execution.

UnsafeQueueUserWorkItem(IThreadPoolWorkItem, Boolean)

지정된 작업 항목 개체를 스레드 풀의 큐에 넣습니다.Queues the specified work item object to the thread pool.

UnsafeQueueUserWorkItem(WaitCallback, Object)

지정된 대리자를 스레드 풀에 대기시키지만 호출 스택을 작업자 스레드에 전파하지 않습니다.Queues the specified delegate to the thread pool, but does not propagate the calling stack to the worker thread.

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

실행을 위해 Action<T> 대리자에 의해 지정된 메서드를 큐에 대기시키고 메서드에서 사용할 데이터가 들어 있는 개체를 지정합니다.Queues a method specified by an Action<T> delegate for execution, and specifies an object containing data to be used by the method. 이 메서드는 스레드 풀 스레드를 사용할 수 있을 때 실행됩니다.The method executes when a thread pool thread becomes available.

UnsafeRegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, Int32, Boolean)

제한 시간(밀리초)에 부호 있는 32비트 정수를 사용하여 WaitHandle을 기다리는 대리자를 등록합니다.Registers a delegate to wait for a WaitHandle, using a 32-bit signed integer for the time-out in milliseconds. 이 메서드는 호출 스택을 작업자 스레드에 전파하지 않습니다.This method does not propagate the calling stack to the worker thread.

UnsafeRegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, Int64, Boolean)

제한 시간(밀리초)에 부호 있는 64비트 정수를 지정하여 WaitHandle을 기다리는 대리자를 등록합니다.Registers a delegate to wait for a WaitHandle, specifying a 64-bit signed integer for the time-out in milliseconds. 이 메서드는 호출 스택을 작업자 스레드에 전파하지 않습니다.This method does not propagate the calling stack to the worker thread.

UnsafeRegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, TimeSpan, Boolean)

제한 시간에 WaitHandle 값을 지정하여 TimeSpan을 기다리는 대리자를 등록합니다. 이 메서드는 호출 스택을 작업자 스레드에 전파하지 않습니다.Registers a delegate to wait for a WaitHandle, specifying a TimeSpan value for the time-out. This method does not propagate the calling stack to the worker thread.

UnsafeRegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, UInt32, Boolean)

제한 시간(밀리초)에 부호 없는 32비트 정수를 지정하여 WaitHandle을 기다리는 대리자를 등록합니다.Registers a delegate to wait for a WaitHandle, specifying a 32-bit unsigned integer for the time-out in milliseconds. 이 메서드는 호출 스택을 작업자 스레드에 전파하지 않습니다.This method does not propagate the calling stack to the worker thread.

적용 대상

스레드 보안

이 형식은 스레드로부터 안전합니다.This type is thread safe.

추가 정보