잡을 준비 수 : Shutting down a multithreaded application
참고 : 제 질문은 우아한 종료를 필요로하지 않았지만, 사람들은 여전히의 루프에서 내가 정상적으로 종료하는 것이 좋습니다 각 스레드.
Thread thread = new Thread(new ThreadStart(testObject.RunLoop));
thread.IsBackground = true;
thread.start();
선호되는 방법은 시작에 스레드를 관리 :
기억해야 할 중요한 것은 당신이하지 않으려 경우 스레드가 당신이 배경에 모든 스레드를 설정해야합니다 종료에서 프로세스를 방지한다는 것입니다 ThreadPool
이지만, 거기에있는 모든 컨테이너를 사용하여 스레드에 대한 참조를 유지할 수 있습니다. 스레드에는 항상 종료를 알리는 플래그가 있어야하며 계속해서 플래그를 확인해야합니다.
더 나은 제어를 위해 스레드에 CountdownLatch
을 제공 할 수 있습니다. 스레드가 루프를 빠져 나올 때마다 CountdownLatch
에 신호를 보냅니다. 주 스레드는 CountdownLatch.Wait()
메서드를 호출하고 모든 스레드가 신호를 보낼 때까지 차단됩니다. 이렇게하면 정리를 시작한 후 모든 스레드가 종료되도록 할 수 있습니다.
public class CountdownLatch
{
private int m_remain;
private EventWaitHandle m_event;
public CountdownLatch(int count)
{
Reset(count);
}
public void Reset(int count)
{
if (count < 0)
throw new ArgumentOutOfRangeException();
m_remain = count;
m_event = new ManualResetEvent(false);
if (m_remain == 0)
{
m_event.Set();
}
}
public void Signal()
{
// The last thread to signal also sets the event.
if (Interlocked.Decrement(ref m_remain) == 0)
m_event.Set();
}
public void Wait()
{
m_event.WaitOne();
}
}
그것은 Thread.Abort() 메소드가 이상한 일을 언급하는 것이 가치가있다 :
스레드 호출 자체에 중단하는 경우, 효과가 예외를 던지는 유사하다; ThreadAbortException 가 즉시 발생하고 결과는 예측 가능합니다. 그러나 하나의 스레드 이 다른 스레드에서 Abort를 호출하면 코드가 실행 되더라도 중단은 중단됩니다. 정적 생성자가 중단 될 수있는 가능성도 있습니다. 드문 경우이지만 이로 인해 해당 클래스의 인스턴스가 해당 응용 프로그램 도메인에 생성 된 이되지 않을 수 있습니다. 에서 .NET Framework 버전 1.0 및 1.1에서는 finally 블록이 실행 중일 때 스레드가 중단 될 수있는 기회가 있습니다.이 경우 마지막으로 블록이 중단됩니다. 호출
스레드 중단 수도 이 중단되고있는 스레드가 같은 catch 블록, 마지막으로 블록 또는 제약 실행 영역으로 코드의 보호 지역에있는 경우 블록. Abort를 호출하는 스레드가 이라면 중단 된 스레드 에 필요한 잠금이 유지되면 교착 상태가 발생할 수 있습니다.
Void ThreadEntry()에서 스레드 시작점의 주 응용 프로그램에서 스레드를 여러 번 만들고 나면 질문을했습니다. 할당 된 스레드 수에 따라 해당 스레드의 다른 응용 프로그램. – shawn