2013-10-05 2 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 является лучшим вариантом.

По MSDN:

IsCompleted возвращает истину, когда задача находится в одном из трех конечных состояний: RanToCompletion, Faulted или Canceled.

Но оно, кажется, возвращает true в состоянии TaskStatus.WaitingForActivation.

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(() => 
    { 
     //?? 
    } 
} 
Смежные вопросы