2013-10-05 65 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(() => 
    { 
     //?? 
    } 
} 
相关问题