Не должно ли это быть ожидаемой задачей с использованием async?
A Task
является долгожданным. Он реализует шаблон GetAwaiter
. Маркировка метода с помощью async
- это просто флаг для компилятора, который сообщает ему преобразовать этот вызов метода в состояние-машину. Но не все методы возврата Task
должны быть помечены как async
. Например:
public Task DoSomethingAsync()
{
Console.WriteLine("Oh yay!");
return Task.CompletedTask;
}
В этом примере я «подделать» асинхронную операцию, возвращая Task.CompletedTask
, я на самом деле не нужно await
ничего.
Другие, более реалистичный пример:
public Task SendWebRequestAsync()
{
var httpClient = new HttpClient();
return httpClient.GetAsync("http://www.google.com");
}
Когда я возвращаюсь в Task
, а не ждать его, я отложив в ожидании от задачи к методу выше стек вызовов. Это означает, что я не выделяю государственную машину, и я также немного меняю способ обработки исключений. Но, поскольку это «хвостовой асинхронный вызов», мне не нужно await
операции и, следовательно, нет необходимости в модификаторе async
.
Заполняется ли ReSharper или Visual Studio? –
Модификатор 'async' не является частью подписи метода. Это просто инструкция na для компилятора для создания конечного автомата. –
@PauloMorgado: Правда, но по умолчанию должно быть предусмотрено 'async', IMO. Eliding 'async' - редкий (и более опасный) случай. –