【发布时间】:2019-11-13 09:38:56
【问题描述】:
我正在尝试异步执行多个任务。然后在继续之前等待所有内容。 但不知何故,我的所有任务都没有完成。查看我的示例代码。
//List from database
List<Promotion> promotions = _dbContext.promotions.ToList();
var promotionTasks = new List<Task>();
List<Promotion> outputPromotions = new List<Promotion>();
foreach (var promotion in promotions)
{
var task = Task.Run(() =>
{
var promotionStatus = GetPromotionStatus(promotion).Result;
var newPromotion = new Promotion
{
Id = promotion.Id,
Name = promotion.Name,
Code = promotion.Code,
StatusId = promotionStatus
};
outputPromotions.Add(newPromotion);
});
promotionTasks.Add(task);
}
//await Task.WhenAll(promotionTasks);
Task.WaitAll(promotionTasks.ToArray());
//Output list
return outputPromotions;
例如
我在promotions 中获得了 50 个值(这是原始列表及其来自数据库)。然后在完成所有任务后,我没有一致地获得 outputPromotions 中的所有 50 个值。
outputPromotions 它给了我 49,48,50,46 的计数,而不是每次都是 50。
我试过 await Task.WhenAll(promotionTasks); 和 Task.WaitAll(promotionTasks.ToArray()); 两者但结果相同。
谁能建议我在这里做错了什么?
【问题讨论】:
-
List<T>对于多线程访问是不安全的。 -
在循环中使用
Task.Run仅通过调用.Result来阻止 是弄巧成拙 -
GetPromotionStatus是做什么的?这很重要。 Task.Run 可能不需要,代码可以转换为简单的 LINQ 查询和 Task.WhenAll
标签: c# multithreading asynchronous asp.net-core async-await