在开始新任务之前检查任务是否已在运行

有一个在任务中执行的过程。 我不希望其中一个同时执行。

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

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

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

根据MSDN :

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

但它似乎也在TaskStatus.WaitingForActivation状态中返回true。

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

您可以查看:

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

更容易:

 if (task?.IsCompleted ?? true) task = TaskFunction();