从异步方法调用 LINQ 查询的 ToList 而不是 ToListAsync 是否是一个潜在的死锁?

From an async method, is calling a LINQ query's ToList, instead of ToListAsync, a potential deadlock?

我遇到了一种情况,我需要一个 单个 LINQ 查询 运行 非异步。原因:目前在异步 EF 调用如何加载大 blob 方面仍然存在错误(有关该问题的更多信息

所以我修复上述错误的选择是将查询转换为自定义 DbCommand 和 运行 原始 SQL 异步, 我可以只需将调用从 ToListAsync 更改为 ToList

TLDR --- 问题: 我知道同步调用异步代码会导致死锁(例如query.ToListAsync().Result),但是,在异步方法中调用非异步版本的 ToList 是否有同样的问题?

I know that calling asynchronous code synchronously can cause a deadlock (e.g. query.ToListAsync().Result), however, does calling the non-asynchronous version of ToList inside of an asynchronous method have the same issue?

调用像 ToList() 这样的同步方法会阻塞当前线程,无论您是否在本应异步的方法中执行此操作。所以它不会死锁但会阻塞调用方法。而且您不希望异步阻塞。请记住,async 方法像任何其他方法一样同步运行,直到它遇到 await.

如果您使用

,您可以在没有编译器警告的情况下保留异步等待签名
return await Task.FromResult(query.ToList());