从异步方法调用 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());
我遇到了一种情况,我需要一个 单个 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 ofToList
inside of an asynchronous method have the same issue?
调用像 ToList()
这样的同步方法会阻塞当前线程,无论您是否在本应异步的方法中执行此操作。所以它不会死锁但会阻塞调用方法。而且您不希望异步阻塞。请记住,async
方法像任何其他方法一样同步运行,直到它遇到 await
.
如果您使用
,您可以在没有编译器警告的情况下保留异步等待签名return await Task.FromResult(query.ToList());