C# 当我不总是运行某些任务时,如何等待所有任务?

C# 当我不总是运行某些任务时,如何等待所有任务?,c#,task-parallel-library,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(con

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

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());
在这种情况下,如果列表为空,我会得到相同的错误,因为所有条件都为false

因此,我的最后一个解决方案是:

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

也不需要检查任务是否为空。

这可以正常工作,无需单独引用任务:

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

也不需要检查任务是否为空。

没有比上一个解决方案更好的了。当然,如果没有你从未使用过的空任务变量…最后一个对我来说似乎很好。我认为第二个选项没有任何问题。空列表上的ToArray应该返回一个空数组,在这种情况下Task.WaitAll应该立即返回。第二个解决方案没有问题,例如,请参阅。虽然我不会在这里这样做,但可以创建一个已经完成的任务,可以在需要任务的地方使用,但不能传递null,但实际上没有要运行的任务。没有比上一个解决方案更好的了。当然,如果没有你从未使用过的空任务变量…最后一个对我来说似乎很好。我认为第二个选项没有任何问题。空列表上的ToArray应该返回一个空数组,在这种情况下Task.WaitAll应该立即返回。第二个解决方案没有问题,例如,请参阅。虽然我不会在这里这样做,但可以创建一个已经完成的任务,可以在需要任务的地方使用,但不能传递null,但实际上没有要运行的任务。