34

有一个进程在任务中执行。我不希望同时执行其中一个以上。

这是检查任务是否已在运行的正确方法吗?

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

5 回答 5

35

正如 Jon Skeet 所建议的,这Task.IsCompleted是更好的选择。

根据MSDN

IsCompleted当任务处于以下三种最终状态之一时将返回 true:RanToCompletionFaultedCanceled

但它似乎在该TaskStatus.WaitingForActivation州也返回 true。

于 2013-10-08T06:27:15.663 回答
12
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               
        });
    }
}
于 2013-10-05T14:21:17.373 回答
2

您可以通过以下方式进行检查:

if ((taskX == null) || (taskX.IsCompleted))
{
   // start Task
   taskX.Start();
   //or
   taskX = task.Factory.StartNew(() =>
   {
      //??
   }
}
于 2015-12-18T08:53:43.967 回答
0

更容易:

if (task?.IsCompleted ?? true)
    task = TaskFunction();
于 2018-09-10T06:48:58.710 回答
-1

在@Mohammad Kohanrooz 回答之后,这是我的扩展方法:

/// <summary>
/// Checks if task is running.
/// </summary>
/// <param name="task">Task to evaluate</param>
/// <returns>True if task is not completed or it's value is null</returns>
public static bool IsRunning(this Task task)
{
    return !task?.IsCompleted ?? false;
}

像这样使用它:

if(myOwnTask.IsRunning())
{
    Logger.Log("Task is already running");  
}
else
{
    Logger.Log("Starting new task");    
    myOwnTask = StartNewTask(); 
}
于 2021-11-13T16:51:27.033 回答