计算非故障任务会导致重新执行每项任务

时间:2016-02-25 18:57:34

标签: c# .net async-await

我使用异步保存

将一大堆项目保存到我的数据库中
var tasks = items.Select(item =>
                         {
                             var clone = item.MakeCopy();
                             clone.Id = Guid.NewGuid();

                             return dbAccess.SaveAsync(clone);
                         });

                        await Task.WhenAll(tasks);

我需要验证SaveAsync成功的次数(如果出现问题,它会抛出异常)。我正在使用IsFaulted标志来检查任务:

                        var successCount = tasks.Count(t => !t.IsFaulted);

集合项目包含3个元素,因此 SaveAsync 应该被调用三次,但执行了6次。仔细检查后,我注意到用c.Count(...)计算非故障任务会导致每个任务重新运行。

我怀疑它与延迟的LINQ执行有关,但我不确定为什么要确切以及如何解决这个问题。

有什么建议我为什么会观察到这种行为以及避免这种伪影的最佳模式是什么?

1 个答案:

答案 0 :(得分:3)

这是因为您的Select查询多次枚举。

要修复它,请通过调用ToList()方法强制枚举。然后它将正常工作。

var tasks = items.Select(item =>
                     {
                         var clone = item.MakeCopy();
                         clone.Id = Guid.NewGuid();
                         return dbAccess.SaveAsync(clone);
                     })
                 .ToList();

你也可以看看这些更详细的答案: