2017-02-15 13 views
5

のは、私が似てすぐに別の非同期メソッドを呼び出すメソッドまたは持っているとしましょう:パススルー非同期メソッドは本当にawait/asyncパターンを必要としますか?

//Main method 
public async Task<int> Foo1(int x) 
{ 
    var result = await DoingSomethingAsync(x); 
    return DoSomethingElse(result); 
} 
//other method 
public async Task<int> Foo2(Double double) 
{ 
    return await Foo1(Convert.ToInt32(double)); 
} 

Foo2ニーズは/持っている必要があることを具体的な理由があるのを非同期/のawait、単に呼び出すこととは対照的に:

//other method 
public Task<int> Foo3(Double double) 
{ 
    return Foo1(Convert.ToInt32(double)); 
} 
消費者には

、これはまだかかわらずの、likeso、待望のようになります。すべてのこれらのステートメント

int x = await Foo1(1); 
int x = await Foo2(1D); 
int x = await Foo3(1D); 

ますコンパイル。コンパイラは2つの異なるメソッドに対して異なるILを生成しますか?

答えて

6

です。特に、Convert.ToInt32がスローすると、例外の動作が異なります。

私は全体としてblog post on the subjectを持っていますが、要約すると、返されたタスクに例外が置かれるため、ここではasync/awaitを使用します。それ以外の場合は、例外が直接スローされます。

例外を直接スローすることは、前提条件の例外(つまり、intに変換できないdoubleを渡すAPI違反です)に対してのみ受け入れられます。そして、(前提条件例外の場合でも)例外を直接スローするか、返されたタスクに配置するかを選択できます。

関連する問題