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

Jam*_*aug 9 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 ) );
}  
Run Code Online (Sandbox Code Playgroud)

是否存在Foo2需要/应该具有异步/等待的特定原因,而不是简单地调用:

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

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

int x = await Foo1(1);
int x = await Foo2(1D);
int x = await Foo3(1D);
Run Code Online (Sandbox Code Playgroud)

所有这些陈述都将汇编.编译器会为两种不同的方法生成不同的IL吗?

Ste*_*ary 9

这取决于.特别是,如果Convert.ToInt32抛出异常行为是不同的.

我有关于这个主题的整篇博文,但总的来说,我会使用async/ awaithere,因为异常将放在返回的任务上.否则,将直接抛出异常.

直接抛出异常仅对前置条件异常是可接受的(即,传递不能转换为int的double的API是违反的).即便如此(对于前置条件异常),您可以选择直接抛出异常或将它们放在返回的任务上.