Thread.Abort()
Thread.Interrupt()
위 두 함수는 극단적인 상황이 아니면 절대 사용해서는 안된다. 대신 모든 쓰레드의 종료는
Thread.Join() 함수로 정상종료를 확인해야한다.
쓰레드는 자체 메모리 공간을 가지고있고 프로세스의 전역변수를 사용할 수 있다.
Abort/Interrupt 함수는 해당 쓰레드가 어떤 동작을 하는중인지 상관없이 CPU 사용권을 빼앗아 강제종료 시키기때문에 함수 호출시 어떤일이 발생할지 알 수가 없다.
예를 들어 쓰레드가 전역변수 뮤텍스를 사용중인데 강제종료 되었다면 해당 뮤텍스를 사용하는 다른 쓰레드는 데드락에 빠져버린다.
굳이 이런 상황이 아니더라도 쓰레드는 반드시 정상종료 시켜야 프로그램의 완성도를 높이고 오동작을 방지할 수 있다.
쓰레드 시작과 종료는 보통 아래코드와 같이하면 문제가 없다.
private Thread threadDoWork;
private bool bThreadDoWorkRun = false;
private void StartDoWork()
{
if (!bThreadDoWorkRun)
{
bThreadDoWorkRun= true;
threadDoWork = new Thread(new ThreadStart(ThreadDoWork));
threadDoWork.Start();
}
}
private void StopDoWork()
{
if (bThreadDoWorkRun)
{
bThreadDoWorkRun = false;
threadDoWork.Join();
}
}
private void ThreadDoWork()
{
while (bThreadDoWorkRun)
{
...
}
}
추가적으로 Suspend/Resume 같은 함수도 사용을 권장하지않는다.
두 함수 역시 해당 쓰레드의 동작여부에 상관없이 중지/재시작을 하기때문에 어떤 상황이 발생할지 알 수가 없다.