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

时间:2016-05-15 10:44:55

标签: c# async-await task-parallel-library override

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

它看起来像这样:

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

并不喜欢:

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

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

1 个答案:

答案 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修饰符。