2012-10-31 4 views
2

나는 자신의 개별 일정에서 실행되는 몇 가지 백그라운드 작업 (TPL 작업)이있는 시나리오를 가지고 있습니다. 작업 1이 작업 2보다 높은 우선 순위로 간주됩니다.TPL 작업을 일시 중지하고 계속할 수 있습니까?

스케줄러가 작업 1을 실행하려면 작업 2가 실행 중인지 확인하고 작업 1이 완료되는 동안 작업을 일시 중지해야합니다.

이것도 가능합니까? 그렇다면 어떻게해야합니까?

+1

이는 TPL을 위해 설계되었습니다되지 않는 것. waithandles로 이것을 접근하는 것이 가능할 수도 있지만 잘못된 방향으로가는 것처럼 보입니다. 여기에있는 디자인을 다시 검토하십시오. –

+0

업데이트 해 주셔서 감사합니다. 나는 그러므로 물어볼 가치가 있다고 확신하지 못했습니다. 현재의 디자인은 현재 "작업 1"만 가지고 있으며 전통적인 스레드를 사용하여 구현했습니다. 나는 TPL에서 일하기 시작했으며 Wait and Continue 메서드를 살펴보고 내가 요청한 것을 달성하기위한 "쉬운"방법이 있기를 바랬다. – ryadavilli

답변

5

신호 구조를 사용하여이를 수행 할 수 있습니다.

static ManualResetEvent mre = new ManualResetEvent(false); 

var Task1=Task.Factory.StartNew(() => 
{ 
    Console.WriteLine("Executing Task 1"); 
    Thread.Sleep(2000); //A Long running operation 
    Console.WriteLine("Task 1 Completed"); 
    mre.Set(); //signal the task completion to task 2. 
}); 


var Task2=Task.Factory.StartNew(() => 
{ 
    if (!Task1.IsCompleted) //check if task1 is completed. 
    { 
     mre.WaitOne(); //wait until Task 1 Completes 
     Console.WriteLine("Executing Task 2"); 
     Thread.Sleep(2000); 
     Console.WriteLine("Task 2 Completed");  
     doSomeTask(); 
    } 
    else 
    { 
     //Task 1 is already completed 
     doSomeTask(); 
    } 

}); 
+0

감사합니다. 작업 2가 이미 시작된 경우이를 이해하는 것이 도움이되지 않을까요? 필자의 경우이 두 가지 작업은 실제로 응용 프로그램 내의 다른 스레드에서 시작됩니다 (다른 곳에서 모두). – ryadavilli

+0

어떤 스레드가 먼저 시작되는지 보장 할 수 없다는 것을 의미합니까? –

+0

예, 맞습니다. – ryadavilli

관련 문제