2016-05-15 1 views
1

Интересно, почему, когда я использую Visual Studio, чтобы переопределить RemoveLoginAsync()приоритету метод асинхронной не добавляя асинхр к подписи метода

это выглядит следующим образом:

public override Task<IdentityResult> RemoveLoginAsync(string userId, UserLoginInfo login) 

И не нравится:

public override async Task<IdentityResult> RemoveLoginAsync(string userId, UserLoginInfo login) 

Не должна ли это быть ожидаемой задачей, используя async?

+0

Заполняется ли ReSharper или Visual Studio? –

+0

Модификатор 'async' не является частью подписи метода. Это просто инструкция na для компилятора для создания конечного автомата. –

+1

@PauloMorgado: Правда, но по умолчанию должно быть предусмотрено 'async', IMO. Eliding 'async' - редкий (и более опасный) случай. –

ответ

2

Не должно ли это быть ожидаемой задачей с использованием 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.

+0

Итак, в частности RemoveLoginAsync удаляет запись db, это должно быть ожидаемо, следует ли добавить асинхронный режим в этом случае? – Yovav

+0

Если вы собираетесь «ждать» по асинхронному методу внутри 'RemoveLoginAsync', тогда да. В противном случае вы не сможете. –