并行运行多个任务,如果其中任何一个返回false .net,则取消休息
目前,我有一个类似的代码:
bool task1Result = await RunTask1(data);
if(!task1Result)
return false;
bool task2Result = await RunTask2(data);
if(!task2Result)
return false;
bool task3Result = await RunTask3(data);
if(!task3Result)
return false;
bool task4Result = await RunTask4(data);
if(!task4Result)
return false;
添加的示例:
private async Task<bool> RunListOfTasks() {
CancellationTokenSource cts = new CancellationTokenSource();
CancellationToken ct = cts.Token;
var tasks = new List<Task<bool>> { RunTask1(data, ct), RunTask2(data, ct), RunTask3(data, ct), RunTask4(data, ct) };
while (tasks.Any())
{
var currentTask = await Task.WhenAny(tasks);
if (!await currentTask)
{
ct.Cancel();
return false;
}
tasks.Remove(currentTask);
}
return true;
}
是否可以并行运行所有这些代码,如果其中一个失败(类似于结果为false),然后停止处理其余的并返回。谢谢
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
task.whenany
-in-a-loop是generally considered an antipattern, because of its包装任务的一种简单方法是选择 linq运算符:
The
Task.WhenAny
-in-a-loop is generally considered an antipattern, because of its O(n²) complexity. The preferred approach is to wrap your tasks in another set of tasks, that will include the functionality of canceling theCancellationTokenSource
when the result isfalse
. Thenawait
the wrapper tasks instead of the initial tasks, and propagate their result.An easy way to wrap the tasks is the
Select
LINQ operator:Microsoft的反应性框架以一种非常好的方式来做到这一点:
它返回所有结果,直到一个任务返回
false
。Microsoft's Reactive Framework does this in a very nice way:
It returns all of the results that come in right up to the point one of the tasks returns a
false
.