Зачем использовать SaveChangesAsync, если параллелизм не поддерживается? - PullRequest
0 голосов
/ 08 января 2019

При использовании 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?

Ответы [ 2 ]

0 голосов
/ 08 января 2019

В этом случае async означает, что SaveChangesAsync() отправит команду в базу данных, освободит текущий поток для выполнения дополнительной работы и продолжит выполнение вашего метода после того, как база данных завершит операции.

Это особенно полезно в двух случаях:

  1. В настольных приложениях это может облегчить поток пользовательского интерфейса для обработки событий и сделать ваше приложение отзывчивым и красивым.
  2. Серверные приложения, где входящие запросы обычно обрабатываются потоком из пула потоков: асинхронный метод освобождает поток до тех пор, пока БД не выполнит операцию, что позволит потоку обслуживать другие запросы.

Подробнее здесь .

0 голосов
/ 08 января 2019

Async! = Параллелизм. Все, что делает асинхронизация, это разблокирует поток, чтобы могла выполняться другая работа, например выполнение других запросов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...