Какой должен быть тип возврата метода asyn c, ничего не возвращающего - PullRequest
0 голосов
/ 21 февраля 2020

У меня есть фрагмент кода, который выдает предупреждение анализатора:

    public async Task SendPasswordEmail(string emailId, string link)
    {
        await _emailSender
            .To(emailId)
            .Subject(EmailUtilsConstants.PasswordEmailSubject)
            .Body(EmailUtilsConstants.PasswordEmailText + link)
            .SendAsync();
    }

Я получаю предупреждение:

Метод 'SendPasswordEmail' не нужно использовать async / await.

Если метод не должен использовать asyn c await, каким должен быть тип возвращаемого значения? Task. Так корректно ли ниже исправление к анализатору?

    public Task SendPasswordEmail(string emailId, string link)
    {
        _emailSender
            .To(emailId)
            .Subject(EmailUtilsConstants.PasswordEmailSubject)
            .Body(EmailUtilsConstants.PasswordEmailText + link)
            .SendAsync();
        return Task.Completed;
    }

1 Ответ

11 голосов
/ 21 февраля 2020

Вы можете удалить ключевые слова async и await в случае одной строки внутри функции. Я предполагаю, что SendAsync возвращает Task объект уже, поэтому не нужно ждать, просто верните, что Task:

public Task SendPasswordEmail(string emailId, string link)
{
    return _emailSender
        .To(emailId)
        .Subject(EmailUtilsConstants.PasswordEmailSubject)
        .Body(EmailUtilsConstants.PasswordEmailText + link)
        .SendAsync();
}

Async/Await привнесет дополнительные издержки в ваш метод. Компилятор создаст «конечный автомат» для всех асин c методов, который не нужен в случае одной строки кода внутри тела метода.

Обновление: (спасибо за комментарий к @JohnathanBarclay)

Другое отличие в случае исключения async/await m обработки исключений немного изменится. Конечный автомат для методов async захватит исключения из вашего кода и поместит их в возвращаемое задание. Но это не будет иметь место в случае исключения async/await.

Подробнее https://blog.stephencleary.com/2016/12/eliding-async-await.html.

...