2010-08-31 5 views
17

오래 걸리는 경우 스레드에서 코드 실행을 중단하는 방법. 스레드가 코드를 너무 오래 실행하고 응용 프로그램이 응답을 멈추는 동안 나는 항상 작동하는 몇 가지 스레드가 있습니다.30 초 후에 코드 실행을 중지하십시오.

코드가 30s에서 실행되지 않으면 스레드가 실행을 멈추고 다음 코드로 넘어갈 가능성이 있습니다. 따라서 응용 프로그램은 여전히 ​​살아 있고 응답을 멈추지 않습니다. 나는 C# .net 3.5을 사용하고있다.

답변

19

나의 대답은 내가 here를 게시 한 것과 비슷하다.

모니터링 스레드에서 지정한 시간 동안 작업자 스레드에서 대기 한 다음 작업자 스레드가 아직 완료되지 않은 경우 강제로 강제 종료 할 수 있습니다. 아래 예제 코드를 참조하십시오.

그러나 일반적으로 Thread.Abort을 사용하여 스레드를 강제 종료하는 것은 좋은 생각이 아닙니다. 대상 스레드가 반드시 알려진 상태가 아니며 해제되지 않은 리소스에 대해 열린 핸들을 가질 수 있기 때문입니다. Thread.Abort을 사용하면 code smell입니다.

더 깨끗한 방법은 작업자 스레드를 변경하여 자체 수명을 관리하는 것입니다. 작업자 스레드는 잘 알려진 체크 포인트에서 실행 된 시간을 확인한 다음 몇 가지 한계를 초과 한 경우 중지 할 수 있습니다. 이 접근 방식은 스레드가 수행중인 실제 작업에 흩어져있는 잠재적 인 많은 검사 점을 필요로한다는 단점이 있습니다. 또한 작업자 스레드는 검사 점간에 너무 많은 계산을 수행하여 쉽게 제한을 초과 할 수 있습니다.

class Program 
{ 
    static void Main(string[] args) 
    { 
     if (RunWithTimeout(LongRunningOperation, TimeSpan.FromMilliseconds(3000))) 
     { 
      Console.WriteLine("Worker thread finished."); 
     } 
     else 
     { 
      Console.WriteLine("Worker thread was aborted."); 
     } 
    } 

    static bool RunWithTimeout(ThreadStart threadStart, TimeSpan timeout) 
    { 
     Thread workerThread = new Thread(threadStart); 

     workerThread.Start(); 

     bool finished = workerThread.Join(timeout); 
     if (!finished) 
      workerThread.Abort(); 

     return finished; 
    } 

    static void LongRunningOperation() 
    { 
     Thread.Sleep(5000); 
    } 
} 
관련 문제