我想知道为什么当我使用visual studio覆盖RemoveLoginAsync()
时它看起来像这样:
public override Task<IdentityResult> RemoveLoginAsync(string userId, UserLoginInfo login)
并不喜欢:
public override async Task<IdentityResult> RemoveLoginAsync(string userId, UserLoginInfo login)
使用async
不应该是一个等待的任务吗?
答案 0 :(得分:2)
不应该是使用异步的等待任务吗?
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
而不是等待它时,我将把等待任务的时间推迟到callstack上方的方法。这意味着我没有分配状态机,而且我也改变了异常处理在这里工作的方式。但是,由于这是一个“尾部异步调用”,我没有await
操作,因此不需要async
修饰符。