【问题标题】:Entity Framework Core - Async / Sync - DbContext实体框架核心 - 异步/同步 - DbContext
【发布时间】:2020-05-16 05:44:29
【问题描述】:

我来向您寻求建议。我正在开发一个需要外部库的控制台应用程序(服务器)。

我使用实体框架核心。但是我对 async / await 的概念仍然存在差距。我已经阅读了很多东西,尝试了很多东西。

我建立了一个关于数据库和ECS(实体组件系统)架构的Entity / DAL / BLL架构。

我有调用事件 (OnInitialized) 的系统。 在这种情况下,我需要从数据库中加载不同的数据(取决于系统)。

不可能在同一个 DbContext 上同时进行多个并行查询。我只有一个包含多个表的数据库。

那么我应该开发与数据库完全同步的交互吗?

或者是否有同时使用多个异步的模式?

【问题讨论】:

  • 对于控制台应用程序,我会坚持使用同步方法。对于 EF,异步版本主要用于保持 UI 线程响应。
  • 只要您不在多个场景中重用相同的实例数据库上下文,异步将永远不会并行运行您的查询。
  • @JohnathanBarclay 是的,但在我的情况下,当我启动服务器(dotnet)时,这会创建与库的通信。多个客户端可以同时执行相同的查询命令。那么,使用异步查询不要“阻止​​”其他客户端的执行不是更好吗?在这个应用程序中,我可以显示消息/UI 界面。

标签: c# async-await entity-framework-core entity-component-system


【解决方案1】:

Entity Framework DbContext 不是线程安全的。所以你不应该使用 DbContext 并发。但是您仍然可以使用异步方法来提高 .NET Core Web API 应用程序的性能。

【讨论】:

    【解决方案2】:

    async/await 模式只是间接连接到并行性。

    我认为,当您“等待”任务返回时,您首先需要准确了解正在发生的事情。在我看来,await-keyword 有点误导。它并没有真正等待函数返回,而是启动您在单独线程中调用的函数,将当前线程状态保存在状态引擎中,并使程序执行路径将控制权返回给调用者。一旦被调用的函数完成,该状态引擎将重建线程状态并继续执行。

    并行化任务实际上非常简单。无需“等待”函数返回,您只需获取函数返回的任务对象,将它们收集到集合中并调用 Task.WaitAll(collection)。之后,所有任务对象都会有一个包含其结果的结果属性。

    【讨论】:

    • 所以在我的情况下(多个客户端同时执行一些(可能)相同的操作),不管 DbContext 的管理如何,最好使用异步?
    • 不,我只是在解释异步等待在内部是如何工作的。就像 AlexBlogs 所说,DbContext 并不安全。每个线程(异步函数)必须有自己的 DBContext 实例...
    猜你喜欢
    • 2017-08-16
    • 2021-12-13
    • 1970-01-01
    • 1970-01-01
    • 2018-07-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多