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

时间:2019-01-08 16:06:05

标签: c# entity-framework

在使用EF上下文并在两个单独的异步方法中调用SaveChangesAsync时,可能会导致上下文出现竞争状况。如果它会导致此类问题,为什么还要使用SaveChangesAsync()?

Microsoft Docs - SaveChangesAsync()-以下内容。

备注 不支持同一上下文实例上的多个活动操作。使用“ 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;       
    }
}

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

2 个答案:

答案 0 :(得分:2)

在这种情况下,异步表示VideoView videoView =(VideoView)findViewById(R.id.vdVw); MediaController mediaController= new MediaController(this); mediaController.setAnchorView(videoView); Uri uri = Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.videoName); videoView.setMediaController(mediaController); videoView.setVideoURI(uri); videoView.requestFocus(); videoView.start(); 将命令发送到数据库,释放当前线程以执行更多工作,并在数据库完成操作后继续执行您的方法。操作。

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

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

查看更多here

答案 1 :(得分:1)

异步!=并行性。异步所做的全部工作就是取消阻塞线程,以便可以进行其他工作,例如满足其他请求。