C# 如果不支持并行性,为什么要使用SaveChangesSync?

C# 如果不支持并行性,为什么要使用SaveChangesSync?,c#,entity-framework,C#,Entity Framework,在两个单独的异步方法中使用EF Context和调用SaveChangesAsync时,可能会在上下文中造成竞争条件。如果saveChangesSync()会导致此类问题,为什么要使用它 -有以下评论 评论 不支持在同一上下文实例上执行多个活动操作。使用“await”确保在此上下文上调用另一个方法之前已完成任何异步操作 public class AccountManager { private readonly ApplicationDbContext _dbContext;

在两个单独的异步方法中使用EF Context和调用SaveChangesAsync时,可能会在上下文中造成竞争条件。如果saveChangesSync()会导致此类问题,为什么要使用它

-有以下评论

评论 不支持在同一上下文实例上执行多个活动操作。使用“await”确保在此上下文上调用另一个方法之前已完成任何异步操作

public class AccountManager
  {
    private readonly ApplicationDbContext _dbContext;

    public AccountManager(ApplicationDbContext dbContext)
    {
        _dbContext = dbContext;
    }

    public async Task UpdateAccountStatus(int id, Status status)
    {
        var acc = await _dbContext.Account.SingleOrDefaultAsync(s => s.Id == id);
        acc.Status = status;
        await _dbContext.SaveChangesAsync();
    }

    public async Task UpdateAccountName(int id, string name)
    {
        var acc = await _dbContext.Account.SingleOrDefaultAsync(s => s.Id == id);
        acc.Name= name;
        await _dbContext.SaveChangesAsync();
    }
}

public class AccountOrchestrator
  {
    private readonly AccountManager _accountManager;

    public AccountOrchestrator(AccountManager accountManager)
    {
        _accountManager= accountManager;
    }

    // Race Condition
    public async Task UpdateAccount(int id, Status status, string Name)
    {
        var token1 = _accountManager.UpdateStatus(id, status);
        var token2 = _accountManager.UpdateName(id, name);

        await token2;
        await token1;       
    }
}

我希望上下文上支持多个异步操作。否则,如果每次都必须等待内联,为什么还要使用异步呢?

async!=相似async所做的就是解除线程阻塞,以便执行其他工作,如满足其他请求。

async!=相似async所做的就是取消阻止线程,以便执行其他工作,如完成其他请求。

在这种情况下,async意味着
savechangesync()
将向数据库发送命令,释放当前线程以执行更多工作,并在数据库完成操作后继续执行方法

这在两种情况下特别有用:

  • 在桌面应用程序中,这可以减轻处理事件的UI线程,并保持应用程序的响应速度和外观
  • 服务器应用程序,其中传入的请求通常由线程池中的线程处理:异步方法将释放线程,直到db执行操作,从而允许线程为其他请求提供服务

  • 请参阅更多信息。

    在本例中,异步意味着
    savechangesync()
    将向数据库发送命令,释放当前线程以执行更多工作,并在数据库完成操作后继续执行方法

    这在两种情况下特别有用:

  • 在桌面应用程序中,这可以减轻处理事件的UI线程,并保持应用程序的响应速度和外观
  • 服务器应用程序,其中传入的请求通常由线程池中的线程处理:异步方法将释放线程,直到db执行操作,从而允许线程为其他请求提供服务

  • 请参阅更多信息。

    它不适用于在上下文本身上发出多个操作。异步处理可用于同时在上下文上发出一个操作,在UI上发出另一个操作。它不用于在上下文本身上发出多个操作。异步处理可用于同时在上下文和UI上发出操作。