ToListAsync()根本没有完成

时间:2014-09-17 17:22:25

标签: c# .net asynchronous entity-framework-6 async-await

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

var res1 = await context.Address().Where(...).ToListAsync();
var res2 = await context.Person().Where(...).ToListAsync();
var res3 = await context.Rule().Where(...).ToListAsync();

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

1 个答案:

答案 0 :(得分:12)

来自评论:

  

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

从非异步方法调用此方法

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

阻止

解决方案:

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

    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);