传递异步方法是否真的需要await / async模式?

时间:2017-02-15 18:14:45

标签: c# asynchronous async-await c#-5.0

让我们说我有一种方法可以立即或类似地调用另一种异步方法:

//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是否需要/应该具有异步/等待的具体原因,而不是简单地调用:

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

在消费者中,无论如何,这仍然是等待的,

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

所有这些陈述都会编译。编译器是否会为两种不同的方法生成不同的IL?

1 个答案:

答案 0 :(得分:8)

这取决于。特别是,如果引发Convert.ToInt32,则异常行为会有所不同。

我有一个完整的blog post on the subject,但总的来说,我会在这里使用async / await,因为异常将放在返回的任务上。否则,将直接抛出异常。

直接抛出异常仅对前置条件异常是可接受的(即,它违反了API以传递无法转换为int的双精度格式)。即便如此(对于前置条件异常),您可以选择直接抛出异常或将它们放在返回的任务上。