스레드 풀링(C# 및 Visual Basic)

스레드 풀은 백그라운드에서 여러 가지 작업을 수행하는 데 사용할 수 있는 스레드의 컬렉션입니다.자세한 내용은 스레딩(C# 및 Visual Basic)을 참조하십시오. 스레드 풀을 사용하면 기본 스레드에서 다른 작업을 비동기적으로 수행할 수 있습니다.

스레드 풀은 대개 서버 응용 프로그램에 사용됩니다.들어오는 각 요청은 스레드 풀의 스레드에 할당되므로 기본 스레드를 사용할 수 있을 때까지 기다리거나 이후의 요청을 처리하는 데 시간을 지연하지 않고 요청을 비동기적으로 처리할 수 있습니다.

풀에 있는 스레드가 해당 작업을 완료하고 대기 스레드의 큐로 반환되면 여기서 해당 스레드를 다시 사용할 수 있습니다.이와 같이 스레드를 다시 사용하면 응용 프로그램에서 각 작업에 대해 새 스레드를 만드느라 리소스를 낭비하지 않아도 됩니다.

스레드 풀에는 일반적으로 스레드의 최대 수가 지정되어 있습니다.모든 스레드에서 작업을 수행 중이면 다른 작업은 사용 가능한 스레드가 생길 때까지 큐에 배치됩니다.

고유한 스레드 풀을 구현할 수도 있지만 ThreadPool 클래스를 통해 .NET Framework에서 제공하는 스레드 풀을 사용하는 것이 더 간편합니다.

스레드 풀링을 사용하는 경우 실행할 프로시저의 대리자를 사용하여 ThreadPool.QueueUserWorkItem 메서드를 호출하면 Visual Basic 또는 C#에서 스레드를 만들고 프로시저를 실행합니다.

스레드 풀링 예제

다음 예제에서는 스레드 풀링을 사용하여 여러 가지 작업을 시작하는 방법을 보여 줍니다.

Public Sub DoWork()
    ' Queue a task.
    System.Threading.ThreadPool.QueueUserWorkItem(
        New System.Threading.WaitCallback(AddressOf SomeLongTask))
    ' Queue another task.
    System.Threading.ThreadPool.QueueUserWorkItem(
        New System.Threading.WaitCallback(AddressOf AnotherLongTask))
End Sub
Private Sub SomeLongTask(ByVal state As Object)
    ' Insert code to perform a long task.
End Sub
Private Sub AnotherLongTask(ByVal state As Object)
    ' Insert code to perform another long task.
End Sub
public void DoWork()
{
    // Queue a task.
    System.Threading.ThreadPool.QueueUserWorkItem(
        new System.Threading.WaitCallback(SomeLongTask));
    // Queue another task.
    System.Threading.ThreadPool.QueueUserWorkItem(
        new System.Threading.WaitCallback(AnotherLongTask));
}

private void SomeLongTask(Object state)
{
    // Insert code to perform a long task.
}

private void AnotherLongTask(Object state)
{
    // Insert code to perform a long task.
}

스레드 풀링의 한 가지 장점은 상태 개체의 인수를 작업 프로시저에 전달할 수 있다는 점입니다.호출할 프로시저에 둘 이상의 인수가 필요한 경우 클래스의 인스턴스 또는 구조체를 Object 데이터 형식으로 캐스팅할 수 있습니다.

스레드 풀 매개 변수 및 반환 값

스레드 풀 스레드에서 값을 반환하는 것은 간단하지 않습니다.Sub 프로시저가 스레드 풀의 큐에 들어갈 수 있는 유일한 프로시저 형식이므로 함수 호출에서 값을 반환하는 일반적인 방법은 사용할 수 없습니다.매개 변수를 제공하고 값을 반환할 수 있는 한 가지 방법은 다중 스레드 프로시저의 매개 변수 및 반환 값(C# 및 Visual Basic)에 설명된 대로 매개 변수, 반환 값 및 메서드를 래퍼 클래스에 래핑하는 것입니다.

QueueUserWorkItem 메서드의 선택적 ByVal 상태 개체 변수를 사용하면 보다 쉽게 매개 변수를 제공하고 값을 반환할 수 있습니다.이 변수를 사용하여 클래스의 인스턴스에 대한 참조를 전달하면 스레드 풀 스레드에서는 이 인스턴스의 멤버를 수정하게 되고 이 인스턴스 멤버가 반환 값으로 사용됩니다.

처음에는 값으로 전달된 변수에서 참조하는 개체를 수정할 수 있다는 것이 이해가 되지 않을 수 있습니다.이는 개체 참조만이 값으로 전달되기 때문에 가능합니다.개체 참조에서 참조하는 개체의 멤버를 변경하면 변경 내용이 실제 클래스 인스턴스에 적용됩니다.

상태 개체 내에서 값을 반환할 때는 구조체를 사용할 수 없습니다.구조체는 값 형식이므로 비동기 프로세스에서 수행한 변경 내용이 원본 구조체의 멤버를 변경하지 않습니다.반환 값이 필요하지 않을 경우에 매개 변수를 제공하려면 구조체를 사용합니다.

참고 항목

작업

방법: 스레드 풀 사용(C# 및 Visual Basic)

참조

스레드 동기화(C# 및 Visual Basic)

QueueUserWorkItem

System.Threading

ThreadPool

개념

다중 스레드 응용 프로그램(C# 및 Visual Basic)

기타 리소스

스레딩(C# 및 Visual Basic)

Visual C#를 사용하여 작업 항목을 스레드 풀에 제출하는 방법