ToListAsync()根本没有完成

ale*_*joy 4 .net c# asynchronous async-await entity-framework-6

我想执行一些查询异步.但是当我通过代码调试时,大多数情况下,当调用ToListAsync()时程序停止.没有可见的异常,并且清除了callstack窗口.当我按下VS中的暂停按钮时,我可以在调用当前方法之前看到堆栈帧.

var res1 = await context.Address().Where(...).ToListAsync();
var res2 = await context.Person().Where(...).ToListAsync();
var res3 = await context.Rule().Where(...).ToListAsync();
Run Code Online (Sandbox Code Playgroud)

有时第一次通话有效,在极少数情况下也是第二次通话.但至少在第三次通话时程序停止了.我完全不知道为什么......

Yuv*_*kov 13

来自评论:

这是一个wpf应用程序.这些命令位于异步方法中.我用非异步方法调用它var result = LoadAsync.Result();

就在那里,这就是僵局.的DispatcherSynchronizationContext尝试编组(第一后一切继续await)返回到调度器(UI)线程,这是目前已被调用LoadAsync.Result

解决方案:

  1. await在您的调用堆栈顶部,方法是返回一个async Task而不是使用Task.Result:

    await LoadAsync();
    
    Run Code Online (Sandbox Code Playgroud)
  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);        
    
    Run Code Online (Sandbox Code Playgroud)

  • 谢谢你的解释.直到现在我才意识到这一点.对于任何需要详细信息的人,我在Stephen Cleary找到了博客文章[Do not Block on Async Code](http://blog.stephencleary.com/2012/07/dont-block-on-async-code.html) . (2认同)