繁体   English   中英

ToListAsync()根本没有完成

[英]ToListAsync() does not complete at all

我想执行一些查询异步。 但是当我通过代码调试时,大多数情况下,当调用ToListAsync()时程序停止。 没有可见的异常,并且清除了callstack窗口。 当我按下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();从非异步方法调用它var result = LoadAsync.Result();

就在那里,这就是僵局 DispatcherSynchronizationContext尝试将继续编组(第一次await之后的所有内容)编组回调度程序(UI)线程,该线程当前被调用LoadAsync.Result

解决方案:

  1. 通过使您的方法返回async Task而不是使用Task.Resultawait调用堆栈的顶部:

     await LoadAsync(); 
  2. 如果您绝对无法将堆栈顶部的方法更改为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); 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM