【问题标题】:multiple asynchronous calls inside an iterative loop迭代循环内的多个异步调用
【发布时间】:2018-07-09 11:37:52
【问题描述】:

我正在尝试关注以下网址中的内容Async and Await with For Loop

但是,如果其中任何一个任务失败,我需要做的一件事是终止所有任务。 在给定的 LoadAsync 方法中如何做到这一点。

【问题讨论】:

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


    【解决方案1】:

    这个答案根本不起作用,因为Parallel 不支持异步。 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); 
            })); 
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-04
      • 2018-10-17
      • 2014-07-04
      • 2012-09-10
      • 2019-03-24
      相关资源
      最近更新 更多