直通异步方法真的需要 await/async 模式吗?
Does a pass-through async method really need the await/async pattern?
假设我有一个方法可以立即或类似地调用另一个异步方法:
//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
needs/should 有 async/await,而不是简单地调用:
//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 吗?
视情况而定。特别是,如果 Convert.ToInt32
抛出异常行为是不同的。
我有一个完整的blog post on the subject,但总的来说,我会在这里使用async
/await
,因为异常会放在返回的任务上。否则直接抛异常
直接抛出异常仅适用于先决条件异常(即,传递无法转换为 int 的 double 违反了 API)。即使这样(对于前提条件异常)您也可以选择直接抛出异常或将它们放在返回的任务中。
假设我有一个方法可以立即或类似地调用另一个异步方法:
//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
needs/should 有 async/await,而不是简单地调用:
//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 吗?
视情况而定。特别是,如果 Convert.ToInt32
抛出异常行为是不同的。
我有一个完整的blog post on the subject,但总的来说,我会在这里使用async
/await
,因为异常会放在返回的任务上。否则直接抛异常
直接抛出异常仅适用于先决条件异常(即,传递无法转换为 int 的 double 违反了 API)。即使这样(对于前提条件异常)您也可以选择直接抛出异常或将它们放在返回的任务中。