在 Windows 桌面应用程序中,上下文与 View 存在的时间一样长,避免“在上一个异步操作完成之前在此上下文上启动第二个操作”错误的最佳方法是什么?
在我的 View 模型中,我收到了一个存储库实例(通过构造函数),它包装了一个长期存在的 DbContext 实例,当我需要加载一些数据时,例如,如果我从相同的方法执行它,那么我可以在异步方法中等待它们中的每一个,这确保它们同步执行。
但是,想象一下我有这个:
private async void SomeMethodA()
{
await Context.GetA();
}
private async void SomeMethodB()
{
await Context.GetB();
}
它们被声明为 void 因为它们实际上是一些事件处理程序。所以,我的代码执行 SomeMethodA(),这个数据库调用可能需要 2 秒。因此,代码执行返回到 UI 线程,然后某些东西(用户或代码)触发 SomeMethodB(),这将引发上述异常。
确保异步数据库调用排队的最佳方法是什么?存储库是处理此问题的最佳场所吗?
最佳答案
what would be the best way to avoid 'A second operation started on this context before a previous asynchronous operation completed' error?
始终等待
您的异步调用。
I can just await for each of them in the async method, which ensures they are executed synchronously.
它们将异步执行,而不是同步执行。但是,它们将连续(一次一个)执行,我认为这就是您的意思。
They are declared as void since they are actually some event handlers.
那是你的问题。他们必须等待。抱歉,它们不能是事件处理程序。您必须修改应用程序设计的这一部分。即使您解决了这个问题(例如,通过每个请求打开多个数据库连接),由于 async void
和“异步模块或处理程序在异步操作时完成”,您仍然会遇到问题仍在等待“异常。
code execution returns to UI thread
这里没有 UI 线程。执行只是返回给调用者。
关于c# - 排队 EF 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37879250/