스레드 일시 중지 및 다시 시작
업데이트: 2007년 11월
스레드 작업을 동기화하는 가장 일반적인 방법은 스레드를 차단한 다음 해제하거나 코드 영역 또는 개체를 잠그는 것입니다. 이러한 잠금 및 차단 메커니즘에 대한 자세한 내용은 동기화 기본 형식 개요를 참조하십시오.
스레드를 중지시킬 수도 있습니다. 스레드가 차단되거나 중지되면 ThreadInterruptedException을 사용하여 대기 상태에서 벗어나게 할 수 있습니다.
Thread.Sleep 메서드
Thread.Sleep 메서드를 호출하면 Thread.Sleep에 전달한 시간(단위: 밀리초)만큼 현재 스레드가 즉시 차단되고 나머지 시간을 다른 스레드로 넘깁니다. 한 스레드는 다른 스레드에서 Thread.Sleep을 호출할 수 없습니다.
Thread.Sleep을 Timeout.Infinite와 함께 호출하면 Thread.Interrupt를 호출하는 다른 스레드에 의해 중단될 때까지 또는 Thread.Abort에 의해 종료될 때까지 스레드가 중지됩니다.
스레드 중단
차단된 스레드에 대해 Thread.Interrupt를 호출하여 ThreadInterruptedException을 throw함으로써 차단 호출에서 스레드를 해제시켜 대기 중인 스레드를 중단시킬 수도 있습니다. 이 스레드는 ThreadInterruptedException을 catch하여 계속 진행하는 데 필요한 작업을 수행해야 합니다. 스레드에서 예외를 무시하면 런타임에서 예외를 catch하여 해당 스레드를 중단시킵니다.
참고: |
---|
Thread.Interrupt를 호출할 때 대상 스레드가 차단되어 있지 않으면 스레드는 차단될 때까지 중단되지 않습니다. 스레드가 차단되지 않으면 중단 없이 완료될 수 있습니다. |
대기가 관리되는 대기인 경우 Thread.Interrupt와 Thread.Abort는 모두 스레드를 즉시 깨웁니다. 대기가 관리되지 않는 대기인 경우(예: 플랫폼에서 Win32 WaitForSingleObject 함수를 P/Invoke 호출한 경우) Thread.Interrupt나 Thread.Abort는 관리 코드로 스레드가 반환되거나 호출될 때까지 스레드를 제어할 수 없습니다. 관리 코드에서 동작은 다음과 같습니다.
Thread.Interrupt는 스레드를 대기 상태에서 깨우고 대상 스레드에 ThreadInterruptedException을 throw합니다.
Thread.Abort는 스레드에 ThreadAbortException이 throw되도록 한다는 점을 제외하고 Thread.Interrupt와 비슷합니다. 자세한 내용은 스레드 삭제를 참조하십시오.
일시 중단 및 다시 시작(사용되지 않음)
중요: |
---|
.NET Framework 버전 2.0에서 Thread.Suspend 및 Thread.Resume 메서드는 obsolete로 표시되어 있으며 이후 릴리스에서 제거됩니다. |
Thread.Suspend를 호출하여 스레드를 일시 중지할 수도 있습니다. 스레드가 자체적으로 Thread.Suspend를 호출하면 다른 스레드에서 해당 스레드를 다시 시작할 때까지 호출이 차단됩니다. 스레드에서 다른 스레드에 대해 Thread.Suspend를 호출하는 경우 이 호출은 다른 스레드를 일시 중지시키는 비차단 호출입니다. Thread.Resume을 호출하면 Thread.Suspend가 호출된 횟수에 상관없이 다른 스레드를 일시 중단 상태에서 벗어나게 하여 스레드의 실행이 다시 시작됩니다. 예를 들어, Thread.Suspend를 연속적으로 다섯 번 호출한 다음 Thread.Resume을 호출하면 Thread.Resume을 호출한 즉시 스레드의 실행이 다시 시작됩니다.
Thread.Sleep과 달리 Thread.Suspend는 스레드의 실행을 즉시 중단하지 않습니다. 공용 언어 런타임은 스레드를 일시 중단하기 전에 스레드가 안전한 시점에 도달할 때까지 대기해야 합니다. 스레드가 시작되지 않았거나 중단된 경우 스레드를 일시 중단시킬 수 없습니다. 안전한 시점에 대한 자세한 내용은 Thread.Suspend, 가비지 수집, 안전한 시점을 참조하십시오.
중요: |
---|
Thread.Suspend 및 Thread.Resume 메서드는 일반적으로 응용 프로그램에서 유용하지 않으며 동기화 메커니즘과 혼동해서는 안 됩니다. Thread.Suspend와 Thread.Resume은 제어되는 스레드의 협력에 의존하지 않으므로 방해가 될 뿐 아니라 예를 들어, 다른 스레드에서 필요로 하는 리소스를 갖고 있는 스레드를 일시 중단시킨 경우, 교착 상태와 같은 심각한 응용 프로그램 문제를 일으킬 수 있습니다. |
응용 프로그램에서 성능 향상을 위해 스레드의 우선 순위를 제어하려면 Thread.Suspend가 아닌 Priority 속성을 사용해야 합니다.
참고 항목
개념
Thread.Suspend, 가비지 수집, 안전한 시점