MSDN Library
콘텐츠의 테이블 축소
콘텐츠의 테이블 확장
정보
요청한 주제가 아래에 표시됩니다. 그러나 이 주제는 이 라이브러리에 포함되지 않습니다.

ThreadPool 클래스

2013-12-13

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

System.Object
  System.Threading.ThreadPool

Namespace:  System.Threading
어셈블리:  mscorlib(mscorlib.dll)

public static class ThreadPool

ThreadPool 형식에서는 다음과 같은 멤버를 노출합니다.

  이름설명
Public 메서드정적 멤버GetMaxThreads동시에 활성 상태가 될 수 있는 스레드 풀에 대한 요청의 수를 검색합니다. 해당 수를 넘는 모든 요청은 스레드 풀 스레드가 사용 가능해질 때까지 큐에 대기 상태로 남아 있습니다.
Public 메서드정적 멤버GetMinThreads스레드 풀에서 새 요청에 대비하여 보유하고 있는 유휴 스레드의 수를 검색합니다.
Public 메서드정적 멤버QueueUserWorkItem(WaitCallback)실행을 위해 메서드를 큐에 대기시킵니다. 이 메서드는 스레드 풀 스레드를 사용할 수 있을 때 실행됩니다.
Public 메서드정적 멤버QueueUserWorkItem(WaitCallback, Object)실행을 위해 메서드를 큐에 대기시키고 메서드에서 사용할 데이터가 들어 있는 개체를 지정합니다. 이 메서드는 스레드 풀 스레드를 사용할 수 있을 때 실행됩니다.
Public 메서드정적 멤버RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, Int32, Boolean)제한 시간(밀리초)에 부호 있는 32비트 정수를 지정하여 WaitHandle을 기다리는 대리자를 등록합니다.
Public 메서드정적 멤버RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, Int64, Boolean)제한 시간(밀리초)에 부호 있는 64비트 정수를 지정하여 WaitHandle을 기다리는 대리자를 등록합니다.
Public 메서드정적 멤버RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, TimeSpan, Boolean)제한 시간에 TimeSpan 값을 지정하여 WaitHandle을 기다리는 대리자를 등록합니다.
Public 메서드정적 멤버RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, UInt32, Boolean)제한 시간(밀리초)에 부호 없는 32비트 정수를 지정하여 WaitHandle을 기다리는 대리자를 등록합니다.
Public 메서드정적 멤버SetMaxThreads보안 중요 동시에 활성 상태가 될 수 있는 스레드 풀에 대한 요청 수를 설정합니다. 해당 수를 넘는 모든 요청은 스레드 풀 스레드가 사용 가능해질 때까지 큐에 대기 상태로 남아 있습니다.
Public 메서드정적 멤버SetMinThreads보안 중요 스레드 풀에서 새 요청에 대비하여 보유하고 있는 유휴 스레드의 수를 설정합니다.
맨 위

스레드 풀을 사용하면 시스템에서 관리하는 작업자 스레드의 풀을 응용프로그램에 제공하여 스레드를 좀 더 효율적으로 사용할 수 있습니다. 한 스레드는 스레드 풀에 대기 중인 여러 대기 작업의 상태를 모니터링합니다. 대기 작업이 완료되면 스레드 풀의 작업자 스레드가 해당 콜백 함수를 실행합니다.

참고참고:

스레드 풀의 스레드를 통해 실행되는 코드에서 사용자 인터페이스 요소에 액세스해야 하는 경우에는 System.Windows.Threading.Dispatcher 클래스를 사용하여 사용자 인터페이스 스레드에서 코드를 실행합니다.

관리되는 스레드 풀에 있는 스레드는 백그라운드 스레드입니다. 즉, IsBackground 속성이 true입니다.

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

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

프로세스마다 스레드 풀이 하나씩 있습니다. 스레드 풀의 기본 크기는 프로세서당 250개의 작업자 스레드와 1000개의 I/O 완료 스레드입니다.

스레드 풀은 최소 개수의 유휴 스레드를 유지 관리합니다. 작업자 스레드의 경우 이 최소 개수의 기본값은 프로세서 수입니다. GetMinThreads 메서드는 최소 개수의 유휴 작업자 및 I/O 완료 스레드를 가져옵니다.

모든 스레드 풀 스레드가 작업에 할당된 후에도 스레드 풀은 즉시 새 유휴 스레드를 만들지 않습니다. 불필요하게 스레드에 스택 공간을 할당하지 않도록 스레드 풀은 일정 간격마다 새 유휴 스레드를 만듭니다. 이 간격은 현재 0.5초이며 이후 버전의 .NET Framework에서 변경될 수도 있습니다.

스레드 풀에서 스레드를 다시 사용할 때는 스레드 로컬 저장소 또는 ThreadStaticAttribute 특성으로 표시된 필드에 있는 데이터가 지워지지 않습니다. 따라서 메서드 중 하나를 통해 스레드 로컬 저장소에 배치된 데이터가 동일한 스레드 풀 스레드에서 실행되는 다른 메서드에 노출될 수 있습니다. ThreadStaticAttribute 특성으로 표시된 필드에 액세스하는 메서드에 제공되는 데이터는 이를 실행하는 스레드 풀 스레드에 따라 다릅니다.

TopicLocation
방법: 비동기 HTTP 처리기 만들기Visual Studio에서 ASP .NET 웹 응용 프로그램 빌드
방법: 비동기 HTTP 처리기 만들기Visual Studio에서 ASP .NET 웹 응용 프로그램 빌드
방법: 비동기 HTTP 처리기 만들기Building ASP .NET Web Applications

다음 예제에서는 QueueUserWorkItem(WaitCallback) 메서드 오버로드를 사용하여 스레드를 사용할 수 있게 되면 ThreadProc 메서드가 나타내는 작업이 실행되도록 큐에 대기시킵니다. 이 오버로드에는 어떠한 작업 정보도 제공되지 않습니다. 따라서 ThreadProc 메서드에서 사용할 수 있는 정보는 이 메서드가 속한 개체로 제한됩니다.

이 예제에서는 해당 출력을 UI 스레드의 TextBlock에 표시합니다. 콜백 스레드에서 TextBlock에 액세스하기 위해 이 예제에서는 Dispatcher 속성을 사용하여 TextBlock에 대한 Dispatcher 개체를 가져온 다음, Dispatcher.BeginInvoke 메서드를 사용하여 크로스 스레드 호출을 수행합니다.

참고참고:

이 예제를 실행하려면 Windows Phone용 정적 TextBlock 컨트롤이 있는 예제 빌드를 참조하세요.


using System;
using System.Threading;

class Example
{
    // This is the UI element that receives the output from the example.
    private static System.Windows.Controls.TextBlock outputBlock;

    // The Demo method runs the example. It saves the TextBlock that is 
    // used for output, and sets up an event handler to start tasks.
    public static void Demo(System.Windows.Controls.TextBlock outputBlock)
    {
        Example.outputBlock = outputBlock;
        outputBlock.Text = "Click here to start a background task.\r\n";

        // Set up an event handler to start a task when the TextBlock 
        // is clicked.
        outputBlock.MouseLeftButtonUp += HandleMouseUp;
    }

    // Clicking the TextBlock queues a delegate to perform a task on a 
    // thread pool thread.
    private static void HandleMouseUp(object sender, 
                                      System.Windows.Input.MouseButtonEventArgs e)
    {
        ThreadPool.QueueUserWorkItem(AppendTextTask);

        // Note: The stateInfo object for the task in this example is
        // Nothing, because this overload of QueueUserWorkItem does not
        // take a stateInfo parameter. 
    }

    // This method performs the task, which is to append text to the
    // TextBlock. To communicate with objects on the UI thread, get the 
    // Dispatcher for one of the UI objects. Use the Dispatcher object's 
    // BeginInvoke method to queue a delegate that will run on the UI thread,
    // and therefore can safely access UI elements like the TextBlock.
    private static void AppendTextTask(object stateInfo)
    {
        outputBlock.Dispatcher.BeginInvoke(delegate () {
            outputBlock.Text += "Hello from the thread pool.\r\n";
        });
    }
}

/* This code produces output similar to the following:

Click here to start a background task.
Hello from the thread pool.
Hello from the thread pool.
Hello from the thread pool.
 */


Windows Phone OS

지원되는 버전: 8.0, 7.1, 7.0

Windows Phone

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

표시:
© 2016 Microsoft