2017-02-15 85 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)。即使如此(对于预先条件异常),您可以选择直接抛出异常或将它们放在返回的任务上。