当在两个单独的异步方法中使用EF上下文和调用SaveChangesAsync时,可以在上下文中造成争用条件。如果SaveChangesAsync()可以引起这样的问题,为什么要使用它呢?
Microsoft SaveChangesAsync() -有以下评论。
注:不支持同一上下文实例上的多个活动操作。在此上下文中调用另一个方法之前,请使用“等待”确保任何异步操作都已完成。
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;
}
}我希望上下文上的多个异步操作将得到支持。否则,如果每次都必须等待内联,那么为什么要使用异步呢?
发布于 2019-01-08 16:08:42
异步!=并行。异步所做的就是解除线程的阻塞,以便其他工作可以进行,例如满足其他请求。
https://stackoverflow.com/questions/54095537
复制相似问题