다음을 통해 공유


ThreadPool 클래스

정의

작업 실행, 작업 항목 게시, 비동기 I/O 처리, 다른 스레드 대신 기다리기 및 타이머 처리에 사용할 수 있는 스레드 풀을 제공합니다.

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

예제

다음 예제에서는 기본 애플리케이션 스레드 큐 라는 메서드 ThreadProc 대기한 1 초에 한 다음 종료 스레드 풀 스레드에서 실행 합니다. 메서드는 ThreadProc 단순히 메시지를 표시합니다.

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 처리하면 스레드 풀 스레드에서 메서드가 실행되기 전에 주 스레드가 종료됩니다. 스레드 풀에는 애플리케이션이 모든 포그라운드 스레드가 종료 된 경우 실행을 유지 하지 않는 백그라운드 스레드를 사용 합니다. (이것은 경합 상태의 간단한 예입니다.)

설명

대부분의 애플리케이션 상당한 시간 대기 상태에서 이벤트가 발생 하기를 기다리는 소비 하는 스레드를 만듭니다. 다른 스레드는 주기적으로 절전 모드 상태로 전환하여 변경 또는 업데이트 상태 정보를 폴링할 수 있습니다. 스레드 풀을 사용 하면 시스템에 의해 관리 되는 작업자 스레드 풀을 사용 하 여 애플리케이션을 제공 하 여 스레드를 보다 효율적으로 사용할 수 있습니다. 스레드 풀 스레드를 사용하는 작업의 예는 다음과 같습니다.

  • 일부 작업을 비동기적으로 수행할 개체를 Task<TResult> 만들 Task 때 기본적으로 스레드 풀 스레드에서 작업이 실행되도록 예약됩니다.

  • 비동기 타이머는 스레드 풀을 사용합니다. 스레드 풀 스레드는 클래스에서 콜백을 System.Threading.Timer 실행하고 클래스에서 이벤트를 발생합니다 System.Timers.Timer .

  • 등록된 대기 핸들을 사용하는 경우 시스템 스레드는 대기 핸들의 상태를 모니터링합니다. 대기 작업이 완료되면 스레드 풀의 작업자 스레드가 해당 콜백 함수를 실행합니다.

  • 메서드를 QueueUserWorkItem 호출하여 스레드 풀 스레드에서 실행할 메서드를 큐에 대기할 때 이 작업은 메서드에 대리자를 전달하여 수행합니다 WaitCallback . 대리자 서명이 있습니다.

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

    state 대리자가 사용할 데이터를 포함하는 개체입니다. 메서드를 호출 QueueUserWorkItem(WaitCallback, Object) 하여 실제 데이터를 대리자에게 전달할 수 있습니다.

참고

관리되는 스레드 풀의 스레드는 백그라운드 스레드입니다. 즉, 해당 IsBackground 속성은 .입니다 true. 즉, 한 ThreadPool 스레드 모든 포그라운드 스레드가 종료 된 후 실행 중인 애플리케이션을 유지 하지 것입니다.

중요

스레드 풀이 스레드를 다시 사용하면 스레드 로컬 스토리지 또는 ThreadStaticAttribute 특성으로 표시된 필드의 데이터가 지워지지 않습니다. 따라서 메서드가 스레드 로컬 스토리지 또는 ThreadStaticAttribute 특성으로 표시된 필드를 검사할 때 발견한 값은 스레드 풀 스레드의 이전 사용에서 남겨둘 수 있습니다.

대기 작업과 관련이 없는 작업 항목을 스레드 풀에 큐에 대기할 수도 있습니다. 스레드 풀의 스레드에서 작업 항목을 처리하도록 요청하려면 메서드를 호출합니다 QueueUserWorkItem . 이 메서드는 스레드 풀에서 선택한 스레드에서 호출될 메서드 또는 대리자 참조를 매개 변수로 사용합니다. 작업 항목이 큐에 대기된 후 취소할 수 있는 방법은 없습니다.

타이머 큐 타이머 및 등록된 대기 작업도 스레드 풀을 사용합니다. 콜백 함수는 스레드 풀에 큐에 대기됩니다.

프로세스당 하나의 스레드 풀이 있습니다. .NET Framework 4부터 프로세스에 대한 스레드 풀의 기본 크기는 가상 주소 공간의 크기와 같은 여러 요인에 따라 달라집니다. 프로세스에서 GetMaxThreads 메서드를 호출하여 스레드 수를 확인할 수 있습니다. 메서드를 사용하여 SetMaxThreads 스레드 풀의 스레드 수를 변경할 수 있습니다. 각 스레드는 기본 스택 크기를 사용하고 기본 우선 순위에 따라 실행됩니다.

참고

.NET Framework 호스트하는 관리되지 않는 코드는 mscoree.h 파일에 정의된 함수를 사용하여 CorSetMaxThreads 스레드 풀의 크기를 변경할 수 있습니다.

스레드 풀은 각 범주의 최대값에 도달할 때까지 요청 시 새 작업자 스레드 또는 I/O 완료 스레드를 제공합니다. 최대값에 도달하면 스레드 풀은 해당 범주에 추가 스레드를 만들거나 일부 작업이 완료될 때까지 기다릴 수 있습니다. .NET Framework 4부터는 스레드 풀이 시간 단위당 완료되는 작업 수로 정의된 처리량을 최적화하기 위해 작업자 스레드를 만들고 삭제합니다. 스레드가 너무 적으면 사용 가능한 리소스가 효율적으로 사용되지 않는 반면, 너무 많으면 리소스 경합이 증가할 수 있습니다.

참고

요구가 적을 때는 실제 스레드 풀 스레드 수가 최소값보다 작을 수 있습니다.

GetMinThreads 메서드를 사용하여 이러한 최소값을 가져올 수 있습니다.

주의

이 메서드를 SetMinThreads 사용하여 최소 스레드 수를 늘릴 수 있습니다. 그러나 이러한 값을 불필요하게 늘리면 성능 문제가 발생할 수 있습니다. 너무 많은 작업이 동시에 시작되는 경우 모두 속도가 느린 것처럼 나타날 수 있습니다. 대부분의 경우 스레드 풀은 고유한 스레드 할당 알고리즘에서 성능이 향상됩니다.

속성

CompletedWorkItemCount

지금까지 처리된 작업 항목 수를 가져옵니다.

PendingWorkItemCount

현재 처리 대기 중인 작업 항목의 수를 가져옵니다.

ThreadCount

현재 존재하는 스레드 풀 스레드의 수를 가져옵니다.

메서드

BindHandle(IntPtr)
사용되지 않습니다.
사용되지 않습니다.

ThreadPool에 운영 체제 핸들을 바인딩합니다.

BindHandle(SafeHandle)

ThreadPool에 운영 체제 핸들을 바인딩합니다.

GetAvailableThreads(Int32, Int32)

GetMaxThreads(Int32, Int32) 메서드에서 반환하는 최대 스레드 풀 스레드 수와 현재 활성 상태인 스레드 수의 차이를 검색합니다.

GetMaxThreads(Int32, Int32)

동시에 활성 상태가 될 수 있는 스레드 풀에 대한 요청 수를 검색합니다. 해당 개수를 초과하는 모든 요청은 스레드 풀 스레드가 사용 가능해질 때까지 큐에 대기 상태로 남아 있습니다.

GetMinThreads(Int32, Int32)

스레드 생성 및 소멸을 관리하기 위한 알고리즘으로 전환하기 전에 새 요청에 따라 스레드 풀이 만드는 스레드의 최소 개수를 검색합니다.

QueueUserWorkItem(WaitCallback)

실행을 위해 메서드를 큐에 대기시킵니다. 이 메서드는 스레드 풀 스레드를 사용할 수 있을 때 실행됩니다.

QueueUserWorkItem(WaitCallback, Object)

실행을 위해 메서드를 큐에 대기시키고 메서드에서 사용할 데이터가 들어 있는 개체를 지정합니다. 이 메서드는 스레드 풀 스레드를 사용할 수 있을 때 실행됩니다.

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

실행을 위해 Action<T> 대리자에 의해 지정된 메서드를 큐에 대기시키고 메서드에서 사용할 데이터를 제공합니다. 이 메서드는 스레드 풀 스레드를 사용할 수 있을 때 실행됩니다.

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

제한 시간(밀리초)에 부호 있는 32비트 정수를 지정하여 WaitHandle을 기다리는 대리자를 등록합니다.

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

제한 시간(밀리초)에 부호 있는 64비트 정수를 지정하여 WaitHandle을 기다리는 대리자를 등록합니다.

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

제한 시간에 WaitHandle 값을 지정하여 TimeSpan을 기다리는 대리자를 등록합니다.

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

제한 시간(밀리초)에 부호 없는 32비트 정수를 지정하여 WaitHandle을 기다리는 대리자를 등록합니다.

SetMaxThreads(Int32, Int32)

동시에 활성 상태가 될 수 있는 스레드 풀에 대한 요청 수를 설정합니다. 해당 개수를 초과하는 모든 요청은 스레드 풀 스레드가 사용 가능해질 때까지 큐에 대기 상태로 남아 있습니다.

SetMinThreads(Int32, Int32)

스레드 생성 및 소멸을 관리하기 위한 알고리즘으로 전환하기 전에 새 요청에 따라 스레드 풀이 만드는 스레드의 최소 개수를 설정합니다.

UnsafeQueueNativeOverlapped(NativeOverlapped*)

실행할 중첩된 I/O 작업을 큐에 대기시킵니다.

UnsafeQueueUserWorkItem(IThreadPoolWorkItem, Boolean)

지정된 작업 항목 개체를 스레드 풀의 큐에 넣습니다.

UnsafeQueueUserWorkItem(WaitCallback, Object)

지정된 대리자를 스레드 풀에 대기시키지만 호출 스택을 작업자 스레드에 전파하지 않습니다.

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

실행을 위해 Action<T> 대리자에 의해 지정된 메서드를 큐에 대기시키고 메서드에서 사용할 데이터가 들어 있는 개체를 지정합니다. 이 메서드는 스레드 풀 스레드를 사용할 수 있을 때 실행됩니다.

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

제한 시간(밀리초)에 부호 있는 32비트 정수를 사용하여 WaitHandle을 기다리는 대리자를 등록합니다. 이 메서드는 호출 스택을 작업자 스레드에 전파하지 않습니다.

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

제한 시간(밀리초)에 부호 있는 64비트 정수를 지정하여 WaitHandle을 기다리는 대리자를 등록합니다. 이 메서드는 호출 스택을 작업자 스레드에 전파하지 않습니다.

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

제한 시간에 WaitHandle 값을 지정하여 TimeSpan을 기다리는 대리자를 등록합니다. 이 메서드는 호출 스택을 작업자 스레드에 전파하지 않습니다.

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

제한 시간(밀리초)에 부호 없는 32비트 정수를 지정하여 WaitHandle을 기다리는 대리자를 등록합니다. 이 메서드는 호출 스택을 작업자 스레드에 전파하지 않습니다.

적용 대상

스레드 보안

이 형식은 스레드로부터 안전합니다.

추가 정보