【发布时间】:2020-01-17 10:48:23
【问题描述】:
我遇到了一种情况,我需要单个 LINQ 查询以非异步方式运行。原因:目前在异步 EF 调用如何加载大 blob 方面仍然存在一个错误(更多信息 Entity Framework async operation takes ten times as long to complete)
所以我修复上述错误的选项是将查询转换为自定义 DbCommand 并异步运行原始 SQL,或者我可以将调用从 ToListAsync 更改为 ToList .
TLDR --- 问题:
我知道同步调用异步代码会导致死锁(例如query.ToListAsync().Result),但是,在异步方法中调用非异步版本的 ToList 是否有同样的问题?
【问题讨论】:
-
List
将保存其中的每个对象,大型 List 将消耗大量内存。我建议您 IQueryable 通常是流式传输的,它们像 IEnumerable 一样被使用,并且不需要将返回的所有元素保存在内存中。要在异步方法中使用 ToList,您必须使用 Task.Run(() =>) 和 Task.Wait();否则会注意完成任务
标签: c# async-await deadlock