2010-12-03 4 views
1

Start 메서드에서 장기 실행 작업을 다른 스레드로 위임 한 다음 프로그램이 있다고 가정 해 보겠습니다. Stop 메서드가 호출 될 때, 나는 작업자 스레드가 현재 작업의 실행을 완료하고 그 작업의 중간에 두지 않도록해야합니다. 작업을 이미 완료했으며 절전 상태이면 즉시 중지 할 수 있습니다.비동기 스레드가 작업을 처리 할 때까지 주 스레드 대기 중지

내가 어떻게해야하는지 안내해주세요.

static int itemsProcessed = 0; 
    static Thread worker; 
    static void Start() 
    { 
     var ts = new ThreadStart(Run); 
     worker = new Thread(ts); 
     worker.Start(); 
    } 

    static void Stop() 
    { 
     //wait until the 'worker' completes processing the current item. 
     Console.WriteLine("{0} Items Processed", itemsProcessed); 
    } 

    static void Run(object state) 
    { 
     while (true) 
     { 
      ALongRunningTask(); 
      itemsProcessed++; 
      Thread.Sleep(1000); 
     } 
    } 

답변

1

한 가지 방법은 두 개의 스레드 betweej 통신 할 수 휘발성 변수를 사용하는 것입니다. 이렇게하려면 "volatile bool isRunning;"을 작성하십시오. Start에서 값을 true로 설정하고 while churge while 루프에서 "while (isRunning)"으로 설정하십시오. stop에서는 isRunning을 false로 설정 한 다음 worker.Join()을 호출하십시오. 그러면 현재 항목 처리가 끝나면 run 메소드가 종료되고 Join은 스레드가 종료 될 때까지 대기합니다.

마지막으로해야 할 일은 itemsProcessed에 스레드로부터 안전하게 액세스하는 것입니다. 현재 코드에서는 Stop이 다른 스레드에서 변경된 이후 itemProcessed의 최신 값을 확인하는지 알 수있는 방법이 없습니다. 한 가지 옵션은 itemsProcessed에 대한 잠금을 만들고 Run 내에서 잠금을 유지하고 Stop의 WriteLine 문 앞에 잠금을 획득하는 것입니다.

1

항상 스레드) (Thread.Join를 호출하여 수행 될 때까지 완료 전체 긴 실행중인 작업 스레드, 당신은 그냥 기다릴 수 원하는 가정;

스레드에서 정상적으로 작업을 완료하려면 일종의 메시지 전달을 수행해야합니다. 가장 단순한 경우에는 부울 일 수 있습니다. 사용자의 경우 스레드가 하나만있는 것처럼 보일 수 있습니다. (가능한 한 많은 여기 단순화) 정적 변수이 작업을 수행하는

static volatile bool processing = true; 
static void Stop() 
{ 
    processing = false; 
    //wait until the 'worker' completes processing the current item. 
    worker.Join(); 
    Console.WriteLine("{0} Items Processed", itemsProcessed); 
} 


static void Run(object state) 
{ 
    while (proccessing) 
    { 
     ALongRunningTask(); 
     itemsProcessed++; 
    } 
} 
+0

이것은 휘발성 처리가 필요합니다. 그렇지 않으면 다른 스레드가 값이 변경된 것을 결코 알 수 없습니다. sleep 루프 대신 worker.Join 메서드를 사용할 수도 있습니다. –

+0

두 진술 모두 정확하지 않습니다. 프로토 타입이 잘못되었습니다. 내 게시물 수정 됨 – BrokenGlass

관련 문제