【发布时间】:2021-06-28 13:59:18
【问题描述】:
我知道在foreach 中使用await 由于性能原因并不是一个好的做法,因为它会按顺序等待每个任务。
foreach (var task in result)
{
task.Stages = await GetStagesForTask(task.Id);
}
那么我该如何改进该代码呢?我试图做这样的事情:
List<Task> listOfTasks = new List<Task>();
foreach (var task in result)
{
var stage = GetStagesForTask(task.Id);
listOfTasks.Add(stage);
task.Stages = stage;
}
await Task.WhenAll(listOfTasks);
但当然因为task.Stages = stage;这里的类型不正确,它不会起作用。
【问题讨论】:
-
在这一行:
foreach (var task in result),task变量的类型是什么? -
你怎么知道在
foreach中使用await不是一个好习惯? AFAIK 这是一种完全有效的方法。它很简单,它没有引入并发/线程安全考虑,并且在许多情况下(例如访问数据库/文件系统)它具有与并发方法相当的性能。 -
为什么你会说“我知道在 foreach 中使用 await 不是一个好习惯,因为性能原因”?那是从哪里来的?这两种方法最适合视情况而定,例如:如果您发出 multilpe Http 请求,则使用 Task.WaitAll 很好,如果您在 Task 内部执行任何类型的数据库操作,则不建议使用任何“ lock”,这与在循环中使用 await 基本相同,许多 dbs 不支持多个 cons 更新相同的行,或者文件被多个线程使用,这可能是一个大问题。更不用说内存消耗了
-
好点@MestreDosMagros,但是例如,如果每个查询都是独立的,那么等待每个结果都是资源浪费。所以 tl;dr 如果操作是独立的,最好同时进行。
标签: c# .net async-await