当我不总是 运行 其中一些时,如何等待所有任务?
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
是否为空。
我想 运行 使用任务并行编写一些代码,但有些并行代码有时我必须 运行 有时不需要。取决于一些条件。所以我在想这样的代码:
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
是否为空。