Присвоение результата асинхронного метода переменной - PullRequest
0 голосов
/ 17 декабря 2018

Я смотрю на "хороший" пример в в этом сценарии , в частности, присваивая результат асинхронного метода переменной.(В данном случае это переменная сброса , но она работает так же, если я просто делаю var x =).

public void Heartbeat(object state)
{
    // Discard the result
    _ = DoAsyncPing();
}

private async Task DoAsyncPing()
{
    await _client.GetAsync("http://mybackend/api/ping");
}

Пытаясь сделать это самостоятельно, я замечаю, что если я удалю _ переменная, я получаю предупреждения компилятора о том, что "этот вызов не ожидается".Почему присвоение результата влияет на то, как вызывается метод?Есть ли где-то неявное await?

Ответы [ 3 ]

0 голосов
/ 17 декабря 2018

О вашем коде, _ содержит задание.

Если вы не поставите ожидание, выполнение существующего метода продолжится независимо от состояния завершения вашего асинхронного метода

если вам нужно дождаться завершения какой-либо асинхронной операции, прежде чем продолжить текущий метод, вы должны указать await

, давайте рассмотрим пример.

  1. Вы хотите получить некоторые данные счетчика извеб-сайт, у которого есть метод для этого (например, 1014 *)

Здесь GetCounter - это асинхронный метод, но вы должны дождаться его, прежде чем продолжить.отсюда ставь жду.

Вы хотите нажать +1 счетчик на тот же веб-сайт, теперь вы не хотите знать, получал ли веб-сайт это в тот момент или нет, вы можете игнорировать установку await.
0 голосов
/ 17 декабря 2018

Если вы хотите вызвать метод Async, вам нужно будет вернуть Task вместо void.

, поскольку вы пытаетесь вызвать DoAsyncPing() из Heartbeat:

1.- Преобразовать void Heartbeat(object state) в async Task HeartbeatAsync(object state).

  • Добавление оператора async позволит вам await внутри него.

  • Конвенция говорит, что вам может потребоваться вызвать awaitable/async методы MethodNameAsync().

2.- Покрытие предыдущегоТеперь вы сможете звонить DoAsyncPing() (я предлагаю переименовать его в DoPingAsync() следующим образом:

public async Task Heartbeat(object state)
{
    // Discard the result
    _ = await DoAsyncPing();
}

Попробуйте этот пост Клири Стивена, где объясняется, какработать с async и await и почему вы должны избегать async void. В двух словах: просто используйте async void для событий, и когда вы вызываете метод async, все внутри него должно возвращать как минимум Task.

Надеюсь, это помогло.

0 голосов
/ 17 декабря 2018

С ключевым словом _ присваивается вывод от DoAsyncPing() до _ как Task.В этом случае выполнение еще не выполняется, а просто задача.

Без _ = функция вызывается, и компилятор предупреждает вас, что вызов не ожидается.Таким образом, первый метод - это присвоение, а второй - выполнение

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