Ждать в последней строке метода

Все еще изучаю асинхронное ожидание. Я столкнулся с примерами, подобными следующему:

public async Task MethodAsync()
{
  await Method01Async();
  await Method02Async();
}

Какова цель последнего ожидания? Method02Async — последняя строка метода MethodAsync. Таким образом, нет никакого остатка метода - никаких строк ниже - ничего, что можно было бы вызвать в обратном вызове, сгенерированном компилятором... Я что-то пропустил?


person Hans    schedule 20.04.2012    source источник


Ответы (1)


На самом деле существует «остаток метода» — он завершает Task, возвращаемый MethodAsync.

(Возвращаемое значение) Method02Async ожидается, так что MethodAsync не будет завершено, пока не завершится Method02Async.

Если у тебя есть:

public async Task MethodAsync()
{
  await Method01Async();
  Method02Async();
}

Затем MethodAsync будет (асинхронно) ждать завершения Method01Async, а затем запускать Method02Async. Затем MethodAsync завершится, в то время как Method02Async может продолжаться.

Как у вас это есть:

public async Task MethodAsync()
{
  await Method01Async();
  await Method02Async();
}

Означает, что MethodAsync будет (асинхронно) ждать завершения Method01Async, а затем (асинхронно) ждать завершения Method02Async, и только после этого будет завершено MethodAsync.

person Stephen Cleary    schedule 20.04.2012
comment
В частности, представьте, если бы Method02Async был, скажем, Task.Delay(5000). Было бы чрезвычайно странно, если бы кто-то сказал await MethodAsync(), а затем эта задача завершилась до завершения задержки! - person Eric Lippert; 20.04.2012
comment
Но не лучше ли написать return Method02Async(); как последняя строка? - person duduamar; 21.02.2016
comment
@dudumar: это не скомпилируется, если вы не удалите async из MethodAsync. Это означает, что вам также придется удалить await из Method01Async. Значительное изменение в поведении. - person Stephen Cleary; 22.02.2016
comment
@StephenCleary, конечно, ты прав. Но если эта последняя строка была единственной строкой, что лучше? вернуть эту задачу (без асинхронного метода) или асинхронное ожидание? - person duduamar; 22.02.2016
comment
@dudumar: В этом случае просто верните задачу без async/await. - person Stephen Cleary; 22.02.2016