【问题标题】:Await for a list of tasks, one at a time等待任务列表,一次一个
【发布时间】:2016-08-13 02:21:34
【问题描述】:

我有以下代码,我不确定它是一次运行一个任务,还是同时运行所有任务,然后等待所有任务完成。

    Dictionary<TemporaryAdditionalData, Exception> rejected = new Dictionary<TemporaryAdditionalData, Exception>();

    await Task.WhenAll(additionalData
        .SelectMaybe(async adda => 
            await this.InsertTemporallyAdditionalData(
                guid, adda.Order, adda.ID, adda.Value, adda.IsMandatory
            ), 
            out rejected
        ).ToArray()
    );

    return rejected;

我认为 SelectMaybe 方法在这里无关紧要,它只是 LINQ 的 Select 的扩展,可以自动捕获异常并返回它们。

1) 任务是一个接一个运行还是同时运行?

2) 无论 1 的答案是什么,我如何编写相同的代码来做相反的事情?

【问题讨论】:

  • 运行代码并自己找出它在做什么。这是一个足够简单的测试。
  • @Servy 我会尝试,我可能必须想出一个更简单的相同逻辑版本,因为我现在没有资源来测试该特定实现。
  • 那将是测试该行为的最佳方法,是的。
  • 相反的方式 = 第一次运行调用所有方法并将它们存储为任务第二次运行等待所有任务

标签: c# async-await


【解决方案1】:

任务将并行执行。如果您希望它们按顺序执行,您可以编写一个简单的循环,如下所示:

foreach (var adda in additionalData) 
{        
    try 
    {
       await this.InsertTemporallyAdditionalData(
           guid, adda.Order, adda.ID, adda.Value, adda.IsMandatory
       );
    }
    catch (Exception ex) 
    {
         rejected[adda] = ex;
    }
}

【讨论】:

  • 不幸的是,这不起作用。出于某种原因,它们仍然以并行方式执行——正如 EF 所证实的那样,“在前一个异步操作完成之前在此上下文上启动了第二个操作”,因为它的每个线程的单个异步操作限制。有什么想法吗?
猜你喜欢
  • 2018-04-15
  • 1970-01-01
  • 1970-01-01
  • 2015-02-02
  • 2013-07-11
  • 1970-01-01
  • 2019-12-10
  • 2012-07-23
  • 1970-01-01
相关资源
最近更新 更多