我想使用任务并行运行一些代码,但有时这些并行代码必须运行,有时不运行。取决于某些条件。所以我在想这样的代码:
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来检查列表是否为空是不是最好的方法,因为我想根据条件运行任务并等待所有这些必须是一个常见的案例。但我无法找到更好的解决方案。
所以我想知道这是否是最好的解决方案,或者是否还有其他更好的解决方案。
感谢。
答案 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
是否为空。