c# - 我可以将 Async/Await 与 dbContext 一起使用吗?如果是这样,我应该什么时候使用 ConfigureAwait(false)?

标签 c# .net multithreading entity-framework asynchronous

假设我有以下代码段:

using (var db = new dbContext()){
     var user = db.Users.Find(3);
     user.Name = "newName";
     var viewModel = GetViewModelAndDoStuffToUser(user);
     db.SaveChanges();
     return viewmodel;
}

现在我试图通过利用 async/await 来大规模提高这个片段的性能,但我读到 dbContext 不是“线程安全的”。所以我有点困惑:
  • 能不能用async/await与 dbContext
  • 相关的调用
  • 我是否应该使用.ConfigureAwait(false)当我做。我读过这告诉我们不要重新输入 MVC 和 WebApi Controller 所需的“.NET 上下文”——但这是为这些 Controller 提供服务的应用程序的服务层。我还读到使用它可以防止死锁。
  • 是否 - 在更复杂的场景中 - 我可以使用 dbContext 的相同实例并行化调用通过使用 Task.WhenAll()

  • 下面的代码片段会是朝着正确方向迈出的可扩展、线程安全的一步吗?
    using (var db = new dbContext()){
         var user = await db.Users.FindAsync(3).ConfigureAwait(false);
         user.Name = "newName";
         var viewModel = await GetViewModelAndDoStuffToUserAsync(user).ConfigureAwait(false);
         await db.SaveChangesAsync().ConfigureAwait(false);
         return viewmodel;
    }
    

    最佳答案

    简短的回答是"is"、"is"和"is"。

    长答案是,虽然数据库上下文不是线程安全的,async/await无论如何,构造都不会将数据库上下文传递给其他线程,因此您在这里是安全的。

    至于调用ConfigureAwait(false)去吧,除了 UI 代码,你应该在任何地方都这样做。由于数据库代码很少放在 UI 层(在高质量的生产代码中从不放在 UI 层)你应该使用 ConfigureAwait(false)在您在后端进行的每个异步调用中。

    最后,如果您通过调用 async 来执行多项任务,数据库上下文的方法,您创建协同程序。它们在您的系统之外并行工作(例如,进行并发 DB 调用),但在您的端,它们不会同时运行。这可以确保您的数据库上下文安全,因为对它的任何更改都是按顺序应用的。

    关于c# - 我可以将 Async/Await 与 dbContext 一起使用吗?如果是这样,我应该什么时候使用 ConfigureAwait(false)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40198347/

    相关文章:

    Python:更新线程中的参数

    c# - 如何在 Xaml 中的文本中包含电子邮件链接?

    c# - 从 ObservableCollection<CProject> 对象获取字符串属性

    c# - 隐式运算符和类层次结构

    c# - 静态属性/函数的性能

    css - 如何更改 .NET MAUI Blazor 元素中的默认字体?

    c# - 使用 Stream.Read() 与 BinaryReader.Read() 处理二进制流

    java - 如何在 JAVA 中重新创建竞争条件?

    c# - WPF Datagrid 不显示所有值

    java - 有人可以帮助解释这两个线程的输出吗?