c# - 排队 EF 查询

标签 c# entity-framework entity-framework-6 async-await

在 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/

相关文章:

c# - Entity Framework 代码优先 ASP.Net 和 DbContext

具有 WCF 数据的 WPF 应用程序 - EF、Linq2Sql 或 WCF 数据服务 - 无似乎 'Easy'

asp.net-core - Asp.net Core最佳实践示例

entity-framework-6 - EF Core - 尚未为此 DbContext 配置数据库提供程序

c# - Webservice动态调用+获取原始数据

c# - 有时可以获取文本但有时显示 "Unable to find element with selector"

c# - 在 C# 中,为什么在这种情况下使用字段与自动实现的属性会导致不同的行为?

c# - 使用 OLE DB SQL 字段的 Windows 搜索

c# - Entity Framework 中的 Linq 嵌套投影

c# - 如何使用 AutoMapper 和 OData 扩展子级别?