我正在尝试按照以下网址Async and Await with For Loop
中的内容进行操作然而,我需要的一件事就是杀死所有任务,如果其中任何一个失败。 如何在给定的LoadAsync方法中完成此操作。
答案 0 :(得分:0)
这个答案根本不起作用,因为Parallel
不是异步识别的。并行lambda将立即返回正在生成的任务。该任务未等待 。它被扔掉了。因此,循环将在启动所有工作后立即退出,而不是等待任何工作完成。
您可以首先创建CancellationTokenSource
并将其Token
属性传递给您要取消的所有代码,从而实现取消。代码本身必须传递该令牌或定期检查令牌。
当您拨打Cancel()
方法时,系统会发出所有活动信号,取消并结束。
您可以使用https://blogs.msdn.microsoft.com/pfxteam/2012/03/05/implementing-a-simple-foreachasync-part-2/实现循环:
public static Task ForEachAsync<T>(this IEnumerable<T> source, int dop, Func<T, Task> body)
{
return Task.WhenAll(
from partition in Partitioner.Create(source).GetPartitions(dop)
select Task.Run(async delegate {
using (partition)
while (partition.MoveNext())
await body(partition.Current);
}));
}