2013-10-05 126 views
21

有一個過程在任務中執行。我不想讓其中的一個以上同時執行。檢查任務是否已在運行之前開始新的

這是檢查任務是否已在運行的正確方法嗎?

private Task task; 

public void StartTask() 
{ 
    if (task != null && (task.Status == TaskStatus.Running || task.Status == TaskStatus.WaitingToRun || task.Status == TaskStatus.WaitingForActivation)) 
    { 
     Logger.Log("Task has attempted to start while already running"); 
    } 
    else 
    { 
     Logger.Log("Task has began"); 

     task = Task.Factory.StartNew(() => 
     { 
      // Stuff     
     }); 
    } 
} 
+10

建議使用'Task.IsCompleted' - 但是記住,總會有這裏的競爭條件的熊。如果任務在你檢查完成後*就完成了,你不會再運行它 - 那沒問題?或者你真的*想在第一個任務結束後立即開始第二項任務? –

+0

啊,我沒有看到'Task.IsComplete'。是的,競賽條件不成問題。謝謝,隨時創建一個答案。 – davenewza

+0

@davenewza,你可能想看看[自我取消和重新啓動任務模式](http://stackoverflow.com/questions/18999827/a-pattern-for-self-cancelling-and-restarting-task) – Noseratio

回答

26

至於建議的喬恩斯基特,該Task.IsCompleted是更好的選擇。

根據MSDNRanToCompletionFaulted,或Canceled:當任務是在三個 最終狀態的一個

IsCompleted將返回true。

但它似乎在TaskStatus.WaitingForActivation狀態也返回true。

4
private Task task; 

public void StartTask() 
{ 
    if ((task != null) && (task.IsCompleted == false || 
          task.Status == TaskStatus.Running || 
          task.Status == TaskStatus.WaitingToRun || 
          task.Status == TaskStatus.WaitingForActivation)) 
    { 
     Logger.Log("Task is already running"); 
    } 
    else 
    { 
     task = Task.Factory.StartNew(() => 
     { 
      Logger.Log("Task has been started"); 
      // Do other things here    
     }); 
    } 
} 
2

你可以檢查一下:

if ((taskX == null) || (taskX.IsCompleted)) 
{ 
    // start Task 
    taskX.Start(); 
    //or 
    taskX = task.Factory.StartNew(() => 
    { 
     //?? 
    } 
} 
相關問題