2016-05-15 12 views
1

に非同期を追加していない非同期メソッドをオーバーライド)私はRemoveLoginAsyncを(上書きするのVisual Studioを使用する理由とき、私は不思議メソッドシグネチャ

それは次のようになります。

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

そしてないように:

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

はそれがasyncを使用してawaitableタスクではないでしょうか?

+0

ReSharperのまたはVisual Studioによって満たされているということですか? –

+0

'async'修飾子はメソッドシグネチャの一部ではありません。これは、コンパイラが状態マシンを作成するためのna命令です。 –

+1

@PauloMorgado:真が、デフォルトではIMO、 'async'を提供するべきです。 'async'を排除することはまれな(より危険な)ケースです。 –

答えて

2

それはawaitableタスク使用して非同期にすべきではありませんか?

Taskがお勧めです。それはGetAwaiterパターンを実装します。 asyncでメソッドをマークすると、単純な状態マシンに、このメソッドの呼び出しを変換するためにそれを伝えますコンパイラへのフラグです。しかし、すべてではないTask返すメソッドはasyncとしてマークする必要があります。例:この例では

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

、私はTask.CompletedTaskを返すことで非同期操作を「偽造」、私は実際にawait何もする必要はありませんでした。

別の、より現実的な例:私はTaskを返すのではなく、それを待っていたとき

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

、私はコールスタックアップ法以上に作業に待っを延期しています。これは、私が状態機械を割り当てていないことを意味しています。また、ここで例外処理がどのように機能するかを少し変えています。しかし、これは "テール非同期呼び出し"なので、私はawaitの操作をする必要がないので、async修飾子の必要はありません。

+0

したがって、特にRemoveLoginAsyncはdbレコードを削除します。この場合は非同期を追加する必要があります。 – Yovav

+0

'RemoveLoginAsync'の中で非同期メソッドの' await'に行くならyesです。さもなければ、あなたはできません。 –

関連する問題