我想执行一些异步查询。 但是当我通过代码调试时,大多数情况下,当调用ToListAsync()时程序停止。 没有可见的异常,并且清除了callstack窗口。 当我按下VS中的暂停按钮时,我可以在调用当前方法之前看到堆栈帧。
var res1 = await context.Address().Where(...).ToListAsync();
var res2 = await context.Person().Where(...).ToListAsync();
var res3 = await context.Rule().Where(...).ToListAsync();
有时第一次通话有效,在极少数情况下第二次通话也有效。 但至少在第三次通话时程序停止了。 我完全不知道为什么......
答案 0 :(得分:12)
来自评论:
这是一个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);