2016-05-15 121 views
1

我不知道为什么,当我使用Visual Studio覆盖RemoveLoginAsync()重写异步方法不增加异步到方法签名

它看起来像这样:

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

,而不是像:

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

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

+0

这是由ReSharper或Visual Studio填写? –

+0

“异步”修饰符不是方法签名的一部分。这只是编译器创建状态机的na指令。 –

+1

@PauloMorgado:是的,但默认应该是提供'async',IMO。避免“异步”是罕见的(也是更危险的)案例。 –

回答

2

不应该是一个等待任务使用异步吗?

A 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而不是等待它,我推迟对任务的方法越往上调用堆栈的等待。这意味着我不会分配一个状态机,而且我也会改变一下异常处理的方式。但是,由于这是一个“尾部异步呼叫”,因此我不需要操作,因此不需要async修改器。

+0

因此,特别是RemoveLoginAsync删除一个数据库记录,这应该是可以等待的,我应该在这种情况下添加异步吗? – Yovav

+0

如果你要在'RemoveLoginAsync'里面的异步方法'await',那么是的。否则,你将无法做到。 –