ASPNet Entity Framework 6-EF6,在同一工作单元中混合异步和同步

ooXei1sh

今天,我遇到了一些代码行,归结起来就是这样:

using (var db = new AppDbContext())
{
    var foo = await db.Foos
        .Where(m => m.Name == "BuzzBaz" )
        .FirstAsync();

    foo.Name = "Quxx";
    db.SaveChanges();
}

请注意,选择查询是,async但对SaveChanges()的调用不是。它是同步的!

这可能会引起任何问题吗?我应该重构它以使用db.SaveChangesAsync();,一切都很好吗?或者,也许只是打电话First()而不是FirstAsync()也许它是无害的并且可能对整体系统性能有所帮助?

我找到了一些文档,使我认为完全删除async可能是一个不错的选择。https://docs.microsoft.com/zh-cn/ef/ef6/fundamentals/async

在大多数使用异步的应用程序中,没有明显的好处,甚至可能有害。在进行异步测试之前,请使用测试,概要分析和常识来衡量异步对您特定场景的影响。

Pac0

您的代码是“正确的”,这意味着它没有根本的缺陷。

让我们分析发生了什么,以及我对它们的2美分:

  • 在查询数据库(FirstAsync)时,使用await意味着将按顺序执行指令,但是不会阻塞线程(异步调用),并且可以将其用于其他用途。这可能是一件好事,如果这是服务器应用程序,则您可能希望线程在等待数据库响应时能够处理其他请求。

  • 但是,使用非异步SaveChanges将阻塞线程。这本身不是错误,但是由于它也是对db的I / O操作,因此可能会在相当长的时间内阻塞线程。如果您也在await此处使用了异步版本,则的确看起来会更加“一致”

那是个问题吗?这取决于。您的应用程序使用率很高吗?您的用户在重负载下是否有一些低反应性?那么在这种情况下,在保存时使用异步可能是潜在的改进。

否则,按照链接的MSDN文章上的建议,除非您知道它会产生影响,否则我的建议是不要太担心。

用法的混合本身不是问题。

就个人而言,我也会选择异步SaveChanges,以保持一致性并想象数据库写入是一些可能很慢的I / O操作。

如果它是桌面应用程序,只需确保您没有阻塞UI线程即可。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

EntityDataSource和Entity Framework 6

如何模拟Entity Framework 6异步方法?

从Entity Framework 6中的集合中删除

Entity Framework v6 中的 TPC

在Entity Framework 6中更新子对象

Entity Framework 6产生的效率低下的查询

与EF 6一起部署Entity Framework Core 2.0?

通过 IDbCommandInterceptor 检测或传递 Entity Framework 6 和 Entity Framework Core 中的调用方法

在SQL CLR中使用Entity Framework 6 / EF Core

从Entity Framework 6升级到EF Core

如何在Entity Framework 6中混合使用TPH和TPT?

使用SQLite和Entity Framework 6时导航属性错误

Entity Framework 6 WithMany 和派生类型

使用MVC 5和Entity Framework 6进行挣扎

EF6 vs Entity Framework Core:插入实体而不将主键(身份)重置为零

具有大型.Any()的Entity Framework 6中的LINQ

在Entity Framework 6中使用SqlQuery <Dictionary <string,string >>

如何在Entity Framework 6中删除多对多关系

在Entity Framework 6中投影自引用多级实体

在 Entity Framework Core 中实现工作单元

哪种逻辑确定Entity Framework 6的插入顺序

具有Distinct过滤器的Entity Framework 6查询

最新的Dapper VS Entity Framework 6性能注意事项

使用Entity Framework 6无法获得存储过程结果

使用 Entity Framework 6 插入断开的相关实体

创建用于Entity Framework 6的表达式

Entity Framework 6迁移能否包括围绕脚本的事务?

Entity Framework 6 如何訂購遷移

如何使用.include查询强制外部联接Entity Framework 6