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

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

ToListAsync() 根本不会完成

从评论:

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

就在那里,这是一个僵局DispatcherSynchronizationContext尝试将延续(第一个await之后的所有内容(封送到调度程序 (UI( 线程,该线程当前被调用阻止LoadAsync.Result

解决方案:

  1. await调用堆栈的顶部,方法是使方法返回async Task而不是使用 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);