覆盖不向方法签名添加异步的异步方法

Overriding an async method not adding async to method signature

我想知道为什么当我使用 visual studio 覆盖 RemoveLoginAsync()

看起来像这样:

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

而不是:

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

使用async不应该是一个可等待的任务吗?

Shouldn't it be an awaitable Task using async?

A Task 是可等待的。它实现了 GetAwaiter 模式。用 async 标记方法只是编译器的一个标志,它告诉编译器将此方法调用转换为状态机。但是,并非所有 Task 返回方法都需要标记为 async。例如:

public Task DoSomethingAsync()
{
    Console.WriteLine("Oh yay!");
    return Task.CompletedTask;
}

在这个例子中,我 "faked" 通过返回 Task.CompletedTask 一个异步操作,我实际上不需要 await 任何东西。

另一个更现实的例子:

public Task SendWebRequestAsync()
{
    var httpClient = new HttpClient();
    return httpClient.GetAsync("http://www.google.com");
}

当我返回 Task 而不是等待它时,我将等待任务推迟到调用堆栈上层的方法。这意味着我不分配状态机,而且我也稍微改变了异常处理在这里的工作方式。但是,由于这是一个 "tail async call",我不必 await 操作,因此不需要 async 修饰符。