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

时间:2018-01-25 18:36:37

标签: c# task-parallel-library

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

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来检查列表是否为空是不是最好的方法,因为我想根据条件运行任务并等待所有这些必须是一个常见的案例。但我无法找到更好的解决方案。

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

感谢。

1 个答案:

答案 0 :(得分:4)

这样就可以了,无需单独引用任务:

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是否为空。