Ожидающие задачи: вернуть задачу или ждать, если после ожидания кода
Я немного почитал и думаю, что понял основные слова ожидания и асинхронные ключевые слова в отношении 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]()