다음을 통해 공유


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

Visual Basic과 C#에서 동시에 여러 작업을 수행하는 응용 프로그램을 만들 수 있습니다. 다른 작업을 지연시킬 가능성이 있는 작업은 별도의 스레드에서 실행되는데, 이러한 프로세스를 다중 스레딩 또는 자유 스레딩이라고 합니다.

다중 스레딩을 사용하는 응용 프로그램에서는 프로세서를 많이 사용하는 작업이 별도의 스레드에서 실행되는 동안에도 사용자 인터페이스가 계속 활성 상태에 있기 때문에 사용자 입력에 빠르게 응답합니다. 또한 다중 스레딩을 사용하면 작업 부하가 늘어날 때마다 스레드를 추가할 수 있으므로 확장 가능한 응용 프로그램을 만드는 경우에도 유용합니다.

참고

Visual Studio 2010 및 .NET Framework 4에서는 새로운 런타임, 새로운 클래스 라이브러리 형식 및 새로운 진단 도구를 제공하여 병렬 프로그래밍에 대한 지원이 향상되었습니다. 자세한 내용은 .NET Framework의 병렬 프로그래밍을 참조하십시오.

BackgroundWorker 구성 요소 사용

다중 스레드 응용 프로그램을 만드는 가장 좋은 방법은 BackgroundWorker 구성 요소를 사용하는 것입니다. 이 클래스는 지정하는 메서드만 처리하는 별도의 스레드를 관리합니다. 예제를 보려면 연습: BackgroundWorker 구성 요소를 사용한 다중 스레딩(C# 및 Visual Basic)을 참조하십시오.

백그라운드에서 작업을 시작하려면 BackgroundWorker를 만들고, 작업 진행률을 보고하고 작업이 완료되면 신호를 보내는 이벤트를 수신합니다. BackgroundWorker 개체는 프로그래밍 방식으로 또는 도구 상자구성 요소 탭에서 폼으로 끌어서 만들 수 있습니다. 폼 디자이너에서 BackgroundWorker를 만들면 구성 요소 트레이에 표시되며 해당 속성은 속성 창에 표시됩니다.

백그라운드 작업에 대한 설정

백그라운드 작업에 대해 설정하려면 DoWork 이벤트에 대한 이벤트 처리기를 추가해야 합니다. 완료하는 데 시간이 많이 걸리는 작업을 이 이벤트 처리기로 호출합니다.

작업을 시작하려면 RunWorkerAsync를 호출합니다. 진행률 업데이트 알림을 받으려면 ProgressChanged 이벤트를 처리합니다. 작업이 완료될 때 알림을 받으려면 RunWorkerCompleted 이벤트를 처리합니다.

ProgressChangedRunWorkerCompleted 이벤트를 처리하는 메서드에서 응용 프로그램의 사용자 인터페이스에 액세스할 수 있는데 그 이유는 이러한 이벤트가 RunWorkerAsync 메서드를 호출한 스레드에서 발생하기 때문입니다. 그러나 DoWork 이벤트 처리기는 백그라운드 스레드에서 실행되므로 사용자 인터페이스 개체를 다룰 수 없습니다.

스레드 만들기 및 사용

응용 프로그램 스레드를 보다 효과적으로 제어하기 위해 스레드를 직접 관리할 수 있습니다. 그러나 올바른 다중 스레드 응용 프로그램을 작성하기가 어려울 수 있습니다. 응용 프로그램이 응답하지 않거나 경합 상태로 인해 일시적인 오류가 발생할 수 있습니다. 자세한 내용은 스레드로부터 안전한 구성 요소를 참조하십시오.

Thread 형식의 변수를 선언하고, 새 스레드에서 실행할 프로시저 또는 메서드의 이름을 제공하여 생성자를 호출하면 새 스레드를 만들 수 있습니다. 코드 예제는 다음과 같습니다.

Dim newThread As New System.Threading.Thread(AddressOf AMethod)
System.Threading.Thread newThread =
    new System.Threading.Thread(AMethod);

스레드 시작 및 중지

새 스레드를 실행하려면 다음 코드와 같이 Start 메서드를 사용합니다.

newThread.Start()
newThread.Start();

스레드의 실행을 중지하려면 다음 코드와 같이 Abort 메서드를 사용합니다.

newThread.Abort()
newThread.Abort();

스레드의 시작과 중지 이외에도 Sleep 또는 Suspend 메서드를 호출하여 스레드를 일시 중지하거나, Resume 메서드를 사용하여 일시 중지된 스레드를 다시 시작하거나, Abort 메서드를 사용하여 스레드를 소멸시킬 수 있습니다.

스레드 메서드

다음 표에서는 각 스레드를 제어하는 데 사용할 수 있는 몇 가지 메서드를 보여 줍니다.

메서드

동작

Start

스레드 실행을 시작하도록 합니다.

Sleep

지정한 시간 동안 스레드를 일시 중지합니다.

Suspend

스레드가 안전한 지점에 도달하면 스레드를 일시 중지합니다.

Abort

스레드가 안전한 지점에 도달하면 스레드를 중지합니다.

Resume

일시 중지된 스레드를 다시 시작합니다.

Join

현재 스레드에서 다른 스레드가 끝나기를 기다리도록 만듭니다. 이 메서드는 제한 시간 값과 함께 사용할 경우 스레드가 할당된 시간 안에 끝나면 True를 반환합니다.

안전한 지점

이러한 메서드의 대부분은 이름 그대로이므로 설명이 필요 없지만 안전한 지점이라는 개념은 사용자에게 새로울 수 있습니다. 안전한 지점은 공용 언어 런타임이 사용되지 않은 변수를 해제하고 메모리를 회수하는 프로세스인 자동 가비지 수집을 수행하기에 안전한 코드 위치를 말합니다. 스레드의 Abort 또는 Suspend 메서드를 호출하면 공용 언어 런타임에서 코드를 분석하여 스레드 실행을 중지할 적절한 위치를 결정합니다.

스레드 속성

스레드에는 다음 표에 있는 것과 같은 유용한 몇 가지 속성도 포함되어 있습니다.

Property

IsAlive

스레드가 활성 상태이면 True 값을 포함합니다.

IsBackground

스레드가 백그라운드 스레드인지 또는 백그라운드 스레드이어야 하는지 여부를 나타내는 부울 값을 가져오거나 설정합니다. 백그라운드 스레드는 포그라운드 스레드와 유사하지만 프로세스가 중지되는 것은 막지 않습니다. 한 프로세스에 속하는 포그라운드 스레드가 모두 중지되고 나면 공용 언어 런타임에서는 아직 활성화되어 있는 백그라운드 스레드에 대해 Abort 메서드를 호출하여 해당 프로세스를 끝냅니다.

Name

스레드의 이름을 가져오거나 설정합니다. 이 속성은 대개 디버깅할 때 개별 스레드를 찾는 데 사용됩니다.

Priority

운영 체제에서 스레드 예약의 우선 순위를 결정하는 데 사용되는 값을 가져오거나 설정합니다.

ApartmentState

특정 스레드에 대해 사용되는 스레딩 모델을 가져오거나 설정합니다. 스레드가 비관리 코드를 호출할 때는 스레딩 모델이 중요합니다.

ThreadState

스레드의 상태를 설명하는 값을 포함합니다.

스레드 우선 순위

모든 스레드에는 해당 스레드가 실행되는 데 걸리는 프로세서 시간을 결정하는 우선 순위 속성이 있습니다. 운영 체제에서는 우선 순위가 낮은 스레드보다 높은 스레드에 더 긴 시간 간격을 할당합니다. 새 스레드는 Normal 값으로 만들어지지만 ThreadPriority 열거형에 있는 다른 값으로 Priority 속성을 변경할 수 있습니다.

다양한 스레드 우선 순위에 대한 자세한 내용은 ThreadPriority를 참조하십시오.

포그라운드 및 백그라운드 스레드

포그라운드 스레드는 무기한 실행되는 반면 백그라운드 스레드는 마지막 포그라운드 스레드가 중지되면 곧바로 중지됩니다. IsBackground 속성을 사용하면 스레드의 백그라운드 상태를 확인하거나 변경할 수 있습니다.

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

다중 스레딩은 프로시저와 클래스 메서드를 실행하는 데 가장 적합하지만 폼 및 컨트롤에도 사용될 수 있습니다. 이 경우 다음 사항을 주의해야 합니다.

  • 가능한 한 컨트롤을 만들 때 사용된 스레드에서만 컨트롤 메서드를 실행합니다. 컨트롤 메서드를 다른 스레드에서 호출해야 하는 경우에는 Invoke를 사용하여 메서드를 호출해야 합니다.

  • 컨트롤이나 폼을 조작하는 스레드는 SyncLock(Visual Basic) 또는 lock(C#) 문을 사용하여 잠그지 않습니다. 컨트롤의 메서드와 폼의 메서드는 종종 호출 프로시저로 콜백되기 때문에 실수로 교착 상태(두 개의 스레드가 서로 다른 쪽의 스레드 잠금이 해제되기를 기다림으로써 응용 프로그램이 중단되는 상태)가 발생할 수 있습니다.

참고 항목

참조

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

Invoke

InvokeRequired

Thread

개념

다중 스레드 프로시저의 매개 변수 및 반환 값(C# 및 Visual Basic)

기타 리소스

구성 요소에서 다중 스레딩

HOWTO: Visual C# .NET을 사용하여 스레드 만들기