Использование await в той же строке, что и вызов метода c # - PullRequest
0 голосов
/ 14 июня 2019

Может ли вызов await в той же строке, что и асинхронный метод, быть медленнее, чем вызов обычного метода?

Из того, что я знаю, асинхронные методы хороши для операций ввода-вывода, таких как получение данных из базы данных.Но что, если между вызовом асинхронного метода и его ожиданием ничего не поделать, мне нужно сделать это в одной строке.

В этом посте Ожидать и Async в одной строке они обсуждаличто преимущество заключается в освобождении потока.

У меня есть несколько модульных тестов для тестирования моих служб и методов с использованием асинхронных методов, как я описал, всегда занимающих больше времени, чем их не асинхронные эквиваленты.Я предполагаю, что это потому, что создание работы в отдельном потоке, а затем ее ожидание имеет определенную цену.

Итак, я хочу спросить, если использование async в этом случае действительно имеет некоторые преимущества.

public async Task AssignHighestRank(User user)
{
    user.Rank = await _rankRepository.GetHighestRank();
    _userRepository.Update(user);
    await _userRepository.SaveChanges();
}

Ответы [ 2 ]

3 голосов
/ 14 июня 2019
Реализация

async использует дополнительные циклы ЦП, поэтому в этом смысле метод async будет немного медленнее, чем его эквивалент, который не является асинхронным. Однако использование такого метода вместе с другими async методами может повысить производительность.

Например, рассмотрим ситуацию, когда вам нужно сделать несколько изменений одновременно:

public async Task RecordBattleResultAsync(User winner, User loser) {
    await Task.WhenAll(
         AssignHighestRankAsync(winner)
    ,    AssignLowestRankAsync(loser)
    ).ConfigureAwait(false);
}

Этот метод будет использовать тот факт, что оба ваших метода async для потенциального ускорения.

0 голосов
/ 14 июня 2019

На основании этого исследования асинхронный метод работает медленно с последовательными операциями, тогда как обычный делает то же самое (если не учитывать, что асинхронные методы не содержат поток выполнения в отличие от обычного):

Должен ли я беспокоиться о том, что «в этом асинхронном методе отсутствуют операторы« ожидания »и он будет работать синхронно» предупреждение

из-за огромного количества работ компилятора под капотом. Но с использованием операции Task.WhenAll (задача создания, которая завершается, когда все задачи также выполнены - основной поток не заблокирован) и Task.WaitAll (почти то же самое сохранение для основного потока заблокировано) с задачей передачи данных о независимости может увеличить ускорение выполнение метода (методы, но не целое приложение в случае Task.WaitAll) из-за параллельного выполнения задачи.

...