0

我有下面的一段代码,它给出了分析器警告:

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

我得到的警告是:

'SendPasswordEmail' 方法不需要使用 async/await。

如果方法不应该使用异步等待,返回类型应该是什么?Task. 那么下面对分析器的修复是否正确?

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

1 回答 1

11

如果函数内有单行,您可以删除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会给您的方法带来额外的开销。编译器将为所有异步方法创建“状态机”,这在方法体内有单行代码的情况下是不必要的。

更新:(感谢@JohnathanBarclay 的评论)

在省略 m 的情况下的另一个区别async/await是异常处理会有所改变。方法的状态机async将从您的代码中捕获异常并将它们放置在返回的任务中。但是,在 eliding 的情况下不会出现这种情况async/await

阅读https://blog.stephencleary.com/2016/12/eliding-async-await.html了解更多信息。

于 2020-02-21T13:15:15.883 回答