2010-06-03 4 views
2

별도의 스레드에서 강력한 방법 dowork을 호출하고 3 초 이상 걸리는 경우이를 죽이고 싶습니다. 다음 코드에 문제가 있습니까?멀티 스레딩 질문

class Class1 
{ 
    /// <summary> 
    /// The main entry point for the application. 
    /// </summary> 
    [STAThread] 
    static void Main(string[] args) 
    { 
     Console.WriteLine("starting new thread"); 

     Thread t = new Thread(new ThreadStart(dowork)); 
     t.Start(); 

     DateTime start = DateTime.Now; 
     TimeSpan span = DateTime.Now.Subtract(start); 

     bool wait = true; 
     while (wait == true) 
     { 
      if (span.Seconds > 3) 
      { 
       t.Abort(); 
       wait = false; 
      } 
      span = DateTime.Now.Subtract(start); 
     } 

     Console.WriteLine("ending new thread after seconds = {0}", span.Seconds); 
     Console.WriteLine("all done"); 
     Console.ReadLine(); 

    } 

    static void dowork() 
    { 

     Console.WriteLine("doing heavy work inside hello"); 
     Thread.Sleep(7000); 
     Console.WriteLine("*** finished**** doing heavy work inside hello"); 
    } 
} 

답변

5

나라면 나는 밀리 초 파라미터를 사용하는 Thread.Join() 오버로드를 사용할 것입니다. (또는 TimeSpan을 사용하는). 더 깨끗하고 더 적은 코드 행을 필요로합니다.

t.Start(); 

if (!t.Join(3000)) 
    t.Abort(); 

Matti가 말했듯이 타이밍 로직을 스레드 프로세스에 넣고 자체 파괴해야합니다.

+0

제한 시간으로 참여를 사용하는 것을 잊어 버렸습니다. 이것은 작업이 그보다 더 빨리 끝나면 3 초 이내에 작업을 계속하기 때문에 나의'Sleep'보다 낫습니다. –

-1

Thread.Join(int)에 대해 알아야한다고 생각합니다. 스레드와 결합하려고 시도하고 지정된 시간이 지난 후에 종료됩니다.이 때 Thread.Abort()으로 전화 할 수 있습니다.

10

이것은 매우 나쁜 프로그래밍 습관입니다. 깔끔하게 종료 할 수없는 스레드는 시작하지 마십시오. 스레드를 시작하는 코드와 스레드를 실행하는 코드에는 통신 할 수있는 잘 정의 된 메커니즘이 있어야합니다. 그런 메커니즘이 많이 있습니다. 예를 들어, 작업자 스레드가 주기적으로 소유자 스레드에 "계속해야합니까?"라고 물을 수 있습니다. 작업자 스레드는 주기적으로 중지할지 여부를 나타내는 threadsafe 필드를 주기적으로 검사 할 수 있습니다. 등등.

새 스레드에서 작업을 시작한 경우 수행중인 작업 또는 수행 할 시간을 모르는 경우에는 불을 사용하고 있습니다. 특히 해당 스레드 코드가 인 경우이 활발하게 반발되지 않습니다.. 스레드를 중단하면 아무 것도 수행하지 않는다고 보장 할 수 없습니다. 당신이 똑똑하다면 쓰레드가 중단되는 것을 막는 코드를 작성할 수 있습니다. 당신이 그 상황에 있다면

는 옳은 일이 (가) 과정이 너무 오래 걸립니다 때 새 과정이 아닌 새로운 스레드의 코드를 시작하고 종료하는 것입니다 .