VB.NET 2008/Visual Basic 2008

스레딩 - 다중 스레딩

본클라쓰 2011. 6. 18. 10:58

Visual Basic 응용 프로그램에서는 각 작업이 별도의 스레드에서 실행되는 프로세스인 다중 스레딩을 사용하여 동시에 여러 개의 작업을 수행할 수 있다. 다중 스레딩을 사용하면 응용 프로그램의 성능과 응답성을 향상시킬 수 있다.

 

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

 

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

 

다중 스레드 응용 프로그램을 만드는 가장 좋은 방법은 backgroundWorker 구성 요소를 사용하는 것이다. 이 클래스는 지정하는 메서드만 처리하는 별도의 스레드를 관리한다.

 

백그라운드에서 작업을 시작하려면 BackgroundWorker를 만들고, 작업 진행률을 보고하고 작업이 완료되면 신호를 보내는 이벤트를 수신한다.

 

 

응용 프로그램 스레드를 보다 효과적으로 제어하기 위해 스레드를 직접 관리할 수 있다. 그러나 올바른 다중 스레드 응용 프로그램을 작성하기가 어려울 수 있다. 응용 프로그램이 응답하지 않거나 경합 상태로 인해 일시적인 오류가 발생할 수 있다.

 

Visual Basic에서 Thread 형식의 변수를 선언하고, AddressOf 문과 새 스레드에서 실행할 프로시저 또는 메서드의 이름을 사용하여 생성자를 호출하면 새 스레드를 만들 수 있다.

 

Dim TestThread As New System.Threading.Thread(AddressOf TestSub)

 

 

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

 

TestThread.Start()

 

 

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

 

TestThread.Abort()

 

 

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

 

TestThread.Sleep(1000)

TestThread.Abort()

 

 

ThreadState 속성은 스레드 상태에 대한 정보를 제공한다. 스레드는 특정 시간에 여러 상태일 수 있으므로 ThreadState에 저장된 값은 ThreadState 열거형의 값이 여러 개 결합된 것일 수 있다. 예를 들어, 스레드가 Wait 호출에서 중단되고 다른 스레드에서 해당 스레드의 Abort 메서드를 호출하면 이 스레드는 WaitSleepJoin과 AbortRequested 상태를 모두 갖게 된다.

 

스레드가 시작된 다음에는 해당 메서드를 호출하여 스레드의 상태를 변경할 수 있다. 예를 들어, Thread.Sleep을 호출하여 고정된 시간(밀리초) 동안 스레드를 일시 중지할 수 있다. Sleep 메서드는 제한 시간을 매개 변수로 사용한다. 제한 시간은 스레드가 차단된 상태로 유지되는 시간(밀리초)이다.

 

Infinite 인수로 Sleep을 호출하면 다른 스레드에서 Interrupt를 호출할 때까지 이 스레드는 대기 상태가 된다. Interrupt 메서드는 대상 스레드를 대기 상태에서 벗어나게 하므로 예외가 발생할 수 있다.

 

Suspend를 호출하여 스레드를 일시 중지할 수도 있다. 스레드가 자체적으로 Suspend를 호출하면 다른 스레드에서 Resume을 호출하여 다시 시작할 때까지 호출이 차단된다. 한 스레드가 다른 스레드에서 Suspend를 호출하면 이 호출은 다른 스레드를 일시 중지시키는 비차단 호출이다. Resume을 호출하면 다른 스레드를 일시 중지 상태에서 벗어나게 하고 다시 실행되도록 한다. Sleep과는 달리 Suspend는 스레드를 즉시 중지시키지 않는다. 즉, 일시 중지되는 스레드는 공용 언어 런타임에서 안전한 지점에 도달했다는 것을 확인할 때까지 일시 중지되지 않는다.

 

 

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

 

첫째, 가능한 한 컨트롤을 만들 때 사용된 스레드에서만 컨트롤 메서드를 실행한다. 컨트롤 메서드를 다른 스레드에서 호출해야 하는 경우에는 invoke의 메서드 호출 방법을 사용해야 한다.

 

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