2017-02-10 17 views
2

1は、コールバックでは、次の方法を持っている場合:非同期コールバックが必要ですか?

await MethodWithCallback(async() => 
    { 
    await _myOtherService.AnotherExcitingAsync(); 
    }); 

それともそれは私が非同期を提供することをお勧めです:

public async Task MethodWithCallback(Action callback) 
{ 
    await _myService.SomeExcitingAsync(); 
    callback(); 
} 

は、それが安全な/のように、非同期コールバックに渡すことをお勧めします私の方法のバージョンは以下のように?違いはありますか?

public async Task MethodWithCallback(Func<Task> callback) { 
    await _myService.SomeExcitingAsync(); 
    await callback(); 
} 
+0

'コールバックで次のメソッドがある場合は、'それはなぜですか?タスクは完了コールバックを置き換えます。このメソッドは 'Task'を返します。したがって、コールバックはまったく必要ありません。 –

+0

私のサンプルコードは、質問を補うために故意に考案されたものです。私がこの質問をする実際の方法はもっと複雑で、合法的にFuncを取っています - それはlambdaを渡すときに非同期コードに二重に注意する必要があることを私に気付かせます。非同期ラムダを使うのは非常に簡単です。期待されていません。 – nullPainter

+0

(私の選択は「コールバック」が貧弱だった - 私は完了コールバックではなく、Func/Actionを意味していた) – nullPainter

答えて

2

TL; DR

コールバックコードが非同期である場合には、デリゲートがTaskを返しています。

長い

あなたはActionに非同期ラムダを割り当てることができますが、それはおそらくあなたが期待している動作はありません。これはasync voidメソッドと同等のものを作成します。

結果として、ラムダが非同期である間に、デリゲートの呼び出し元は、完了するのを待つことができず、その結果を見ることができなくなります。キャッチされていない例外はすべて失われます。

これはC#で許可されていますが、これらの注意点を念頭に置いてコードを非常に慎重に作成することは非常にまれです。

関連する問題