当我不总是 运行 其中一些时,如何等待所有任务?

How to wait all task when I not always I run some of them?

我想 运行 使用任务并行编写一些代码,但有些并行代码有时我必须 运行 有时不需要。取决于一些条件。所以我在想这样的代码:

Task myTsk01 = null;
Task myTsk02 = null;
Task myTsk03 = null;

if(condition01 true) myTask01 = Task.Run(() => myCode01);
if(condition02 true) myTask02 = Task.Run(() => myCode02);
if(condition03 true) myTask03 = Task.Run(() => myCode03);

Task.WaitAll(myTsk01, myTsk02, myTsk03);

但是,使用此代码时,我会收到错误消息,因为有时至少有一个任务为空。

所以我尝试了另一种选择:

Task myTsk01 = null;
 Task myTsk02 = null;
 Task myTsk03 = null;
 List<Task> myLstTasks = new List<Tasks>();
 if(condition01 true) miLstTasks.Add(Task.Run(() => myCode01));
 if(condition02 true) miLstTasks.Add(Task.Run(() => myCode02));
 if(condition03 true) miLstTasks.Add(Task.Run(() => myCode03));

 Task.WaitAll(myLstTasks.ToArray());

在这种情况下,如果列表为空,我会得到同样的错误,因为所有条件都是假的。

所以我最后的解决方案是:

 Task myTsk01 = null;
 Task myTsk02 = null;
 Task myTsk03 = null;
 List<Task> myLstTasks = new List<Tasks>();
 if(condition01 true) miLstTasks.Add(Task.Run(() => myCode01));
 if(condition02 true) miLstTasks.Add(Task.Run(() => myCode02));
 if(condition03 true) miLstTasks.Add(Task.Run(() => myCode03));

 if(myListTsk.Count > 0) Task.WaitAll(myLstTasks.ToArray());

这个解决方案有效,但我认为使用 if 检查列表是否为空并不是最好的方法,因为我猜 运行 任务根据条件并等待所有其中,它必须是一个常见的情况。但是我找不到更好的解决方案。

所以我想知道这是否是最好的解决方案,或者是否还有其他更好的解决方案。

谢谢。

这会很好地工作,而不必单独引用任务:

List<Task> tasks = new List<Tasks>();

if(condition01) 
    tasks.Add(Task.Run(() => myCode01));
if(condition02)
    tasks.Add(Task.Run(() => myCode02));
if(condition03) 
    tasks.Add(Task.Run(() => myCode03));

Task.WaitAll(tasks.ToArray());

也不需要检查tasks是否为空。