C# 异步方法的返回类型应该是什么

C# 异步方法的返回类型应该是什么,c#,async-await,C#,Async Await,我有一段代码,下面给出了analyzer警告: public async Task SendPasswordEmail(string emailId, string link) { await _emailSender .To(emailId) .Subject(EmailUtilsConstants.PasswordEmailSubject) .Body(EmailUtilsConstant

我有一段代码,下面给出了analyzer警告:

    public async Task SendPasswordEmail(string emailId, string link)
    {
        await _emailSender
            .To(emailId)
            .Subject(EmailUtilsConstants.PasswordEmailSubject)
            .Body(EmailUtilsConstants.PasswordEmailText + link)
            .SendAsync();
    }
我得到的警告是:

方法“SendPasswordEmail”不需要使用async/await

如果该方法不应该使用async await,那么返回类型应该是什么<代码>任务。那么下面的修正是否正确

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

如果函数内部为单行,则可以删除
async
wait
关键字。 我猜
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的评论)

另一个不同之处是,如果省略
async/await
m,异常处理将发生一些变化。
async
方法的状态机将从代码中捕获异常,并将它们放在返回的任务中。但是,如果省略
async/await
,情况就不一样了


阅读了解更多信息。

公共异步任务
sais它需要一个任务。Async/await不是别的,当使用例如Task时,返回一个在编译器中有值的任务将被解包。如果
主题或
正文
抛出异常,则唯一的问题是;它将直接抛出,而不是放在
任务上。这不仅仅是一个简单的传递到
SendAsync
的过程,所以我认为这个警告有点幼稚。