Ожидающие задачи: вернуть задачу или ждать, если после ожидания кода

Я немного почитал и думаю, что понял основные слова ожидания и асинхронные ключевые слова в отношении System.Threading.Task.

Я не уверен, что я прав по небольшой проблеме, однако, и ищу проверку или кого-то, кто меня поправит.

Я реализую метод async с этой сигнатурой:

public Task ProcessUploadedFile(FileInfo info, string contentType);

Очевидно, что если я хочу ожидать чего-либо внутри метода, мне нужно добавить ключевое слово async в подпись,

Мой вопрос таков: если последнее, что мой метод делает, вызывает другой метод async или возвращает задачу, есть ли какой-нибудь момент в ожидании его?

Eg.

1:

public async Task ProcessUploadedFile(FileInfo info, string contentType)
{
  foreach (var something in someCollection)
    DoSomething();

  DoSomethingElse();

  await DoMethodAsync();
}

2:

public Task ProcessUploadedFile(FileInfo info, string contentType)
    {
      foreach (var something in someCollection)
        DoSomething();

      DoSomethingElse();

      return DoMethodAsync();
    }

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

Есть ли разница в приведенном выше? Что "лучше"?

Ответы

Ответ 1

await используется для продолжения выполнения тела метода при ожидании завершения. Если вам нечего продолжать, то вам не нужно ждать.

Вы можете думать о ожидании (упрощенном) как о операции ContinueWith. Итак, ваш первый метод - это что-то вроде:

foreach (var something in someCollection)
     DoSomething();

DoSomethingElse();

DoMethodAsync().ContinueWith(t => {});

Есть хорошая статья MSDN, в которой описывается что происходит в асинхронном методе, который имеет красивое изображение потока кода:

enter image description here