При использовании EF Context и вызове SaveChangesAsync в двух отдельных асинхронных методах вы можете вызвать состояние гонки в контексте. Зачем использовать SaveChangesAsync (), если это может вызвать такие проблемы?
Документы Microsoft - 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;
}
}
Я ожидаю, что будут поддерживаться несколько асинхронных операций в контексте. Иначе зачем вообще использовать async, если вам нужно каждый раз ждать inline?