在开始新任务之前检查任务是否已在运行
有一个在任务中执行的过程。 我不希望其中一个同时执行。
这是检查任务是否已在运行的正确方法吗?
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:RanToCompletion
,RanToCompletion
或Canceled
。
但它似乎也在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();