2017-02-15 70 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); 

所有這些語句會編譯。編譯器會爲兩種不同的方法生成不同的IL嗎?

回答

6

這取決於。特別是,如果Convert.ToInt32引發異常行爲是不同的。

我有一個完整的blog post on the subject,但總而言之,我會在這裏使用async/await,因爲異常將放置在返回的任務上。否則,該異常將直接拋出。

直接拋出異常僅適用於先決條件異常(即違反API傳遞無法轉換爲int的double)。即使如此(對於預先條件異常),您可以選擇直接拋出異常或將它們放在返回的任務上。

相關問題