ToListAsync() 根本不会完成
本文关键字:ToListAsync | 更新日期: 2023-09-27 18:22:10
我想异步执行一些查询。但是当我通过代码进行调试时,大多数时候当调用ToListAsync((时,程序会停止。没有可见的异常,并且调用堆栈窗口已清除。当我在 VS 中按下暂停按钮时,我可以看到调用当前方法之前的堆栈帧。
var res1 = await context.Address().Where(...).ToListAsync();
var res2 = await context.Person().Where(...).ToListAsync();
var res3 = await context.Rule().Where(...).ToListAsync();
有时第一次调用有效,在极少数情况下第二次调用也有效。但至少在第三次调用时,程序停止。我完全不知道为什么...
从评论:
它是一个 wpf 应用程序。这些命令位于异步方法中。我使用
var result = LoadAsync.Result();
从非异步方法调用它
就在那里,这是一个僵局。DispatcherSynchronizationContext
尝试将延续(第一个await
之后的所有内容(封送到调度程序 (UI( 线程,该线程当前被调用阻止LoadAsync.Result
解决方案:
-
await
调用堆栈的顶部,方法是使方法返回async Task
而不是使用Task.Result
:await LoadAsync();
-
如果您绝对无法将堆栈顶部的方法更改为
async Task
并且由于某种晦涩的原因仍然必须调用Task.Result
,请在监视内部异步方法时使用ConfigureAwait(false)
。这将告知同步上下文明确不要尝试将工作封送回调度程序线程:var res1 = await context.Address().Where(...).ToListAsync().ConfigureAwait(false); var res2 = await context.Person().Where(...).ToListAsync().ConfigureAwait(false); var res3 = await context.Rule().Where(...).ToListAsync().ConfigureAwait(false);