迭代循环内的多个异步调用

时间:2018-01-30 14:34:12

标签: c# asynchronous async-await task c#-5.0

我正在尝试按照以下网址Async and Await with For Loop

中的内容进行操作

然而,我需要的一件事就是杀死所有任务,如果其中任何一个失败。 如何在给定的LoadAsync方法中完成此操作。

1 个答案:

答案 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); 
        })); 
}
相关问题