다음을 통해 공유


스레드 풀링

업데이트: 2007년 11월

스레드 풀링은 작업이 큐에 추가된 다음 스레드가 만들어질 때 자동으로 시작되는 다중 스레딩의 한 형태입니다. 스레드 풀링을 사용하는 경우 실행할 프로시저의 대리자를 사용하여 ThreadPool.QueueUserWorkItem 메서드를 호출하면 Visual Basic에서 스레드를 만들고 프로시저를 실행합니다.

스레드 풀링 예제

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

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
Sub SomeLongTask(ByVal state As Object)
    ' Insert code to perform a long task.
End Sub
Sub AnotherLongTask(ByVal state As Object)
    ' Insert code to perform another long task.
End Sub

스레드 풀링은 각 스레드의 속성을 개별적으로 설정하지 않고 여러 개의 개별 작업을 시작하려는 경우에 유용합니다. 각 스레드는 기본 스택 크기와 우선 순위로 시작됩니다. 기본적으로 시스템 프로세서 당 최대 25개의 스레드 풀 스레드가 실행될 수 있습니다. 이 한계를 초과하는 추가 스레드는 큐에 들어갈 수 있지만 다른 스레드가 끝나야만 시작됩니다.

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

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

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

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

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

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

참고 항목

개념

Visual Basic의 고급 다중 스레딩

다중 스레드 응용 프로그램

스레드 동기화

폼 및 컨트롤에 다중 스레딩 사용

참조

QueueUserWorkItem

System.Threading

SyncLock 문