Question Vérifiez si la tâche est déjà en cours d'exécution avant de commencer


Il y a un processus qui est exécuté dans une tâche. Je ne veux pas que plusieurs d’entre eux soient exécutés simultanément.

Est-ce la bonne façon de vérifier si une tâche est déjà en cours d'exécution?

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                
        });
    }
}

23
2017-10-05 11:39


origine


Réponses:


Comme suggéré par Jon Skeet, le Task.IsCompleted est la meilleure option.

Selon MSDN:

IsCompleted retournera vrai lorsque la tâche est dans l'un des trois   États final: RanToCompletion, Faulted, ou Canceled.

Mais il semble que cela soit vrai dans le TaskStatus.WaitingForActivation Etat aussi.


30
2017-10-08 06:27



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               
        });
    }
}

7
2017-10-05 14:21



Vous pouvez le vérifier avec:

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

2
2017-12-18 08:53