覆盖不向方法签名添加异步的异步方法
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
修饰符。
我想知道为什么当我使用 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
修饰符。