首页 > 解决方案 > 我应该在查询时调用 ToListAsync()

问题描述

我不久前还在 C# 中寻找一些如何编写代码的最佳实践。现在,我正在使用 EF Core 并拥有以下代码

var details = _dbContext.Details.Where(x => x.Name == "Button");
foreach(var detail in details)
{
   ...
}

为了更好地响应,我尝试使用ToListAsync()like

var details = await _dbContext.Details.Where(x => x.Name == "Button").ToListAsync();

如果我理解,它应该是更有效的方式。我应该一直使用ToListAsync()foreach

删除也是一样。第一个

var details = _dbContext.Details.Where(x => x.Id == "Button");
_dbContext.Details.RemoveRange(details);

或者

 var details = await _dbContext.Details.Where(x => x.Id == "Button").ToListAsync();
_dbContext.Details.RemoveRange(details);

哪一个会更好?那么,当我不添加时ToListAsync(),查询会同步运行吗?

标签: c#entity-frameworkasp.net-coreentity-framework-core

解决方案


从操作返回 IEnumerable 会导致序列化程序进行同步集合迭代。结果是调用阻塞和线程池饥饿的可能性。为避免同步枚举,请在返回可枚举之前使用 ToListAsync。

从 ASP.NET Core 3.0 开始,IAsyncEnumerable 可用作异步枚举的 IEnumerable 的替代方案。有关详细信息,请参阅控制器操作返回类型。

有关更多信息,请查看ASP.NET Core 性能最佳实践


推荐阅读