级联ConfigureAwait(false),有必要吗?
Cascading ConfigureAwait(false), is it necessary?
我正在开发一个 MVC5 ASP.NET 应用程序,我有以下问题。
如果我在这样定义的控制器中有一个动作:
public async Task<ActionResult> MyAction()
{
await MethodAsync().ConfigureAwait(false);
}
然后,如果 MethodAsync 调用另一个异步方法,则这样:
public async Task<bool> MethodAsync()
{
await OtherMethodAsync().ConfigureAwait(false);
}
在等待的方法中再次调用 ConfigureAwait(false) 是否有意义?还是我应该使用默认值 (ConfigureAwait(true))?
谢谢
海梅
每种方法应自行决定是否使用 ConfigureAwait(false)
。如果那个方法需要它的上下文(在这种情况下,HttpContext.Curent
/culture/identity),那么它不应该使用ConfigureAwait(false)
.
记住这段代码:
await MethodAsync().ConfigureAwait(false);
与这段代码大致相同:
var task = MethodAsync();
var configuredTask = task.ConfigureAwait(false);
await configuredTask;
换句话说,MethodAsync
在ConfigureAwait
之前被称为。所以这个方法被调用with当前上下文,然后等待它返回的任务没有捕获上下文。
我正在开发一个 MVC5 ASP.NET 应用程序,我有以下问题。
如果我在这样定义的控制器中有一个动作:
public async Task<ActionResult> MyAction()
{
await MethodAsync().ConfigureAwait(false);
}
然后,如果 MethodAsync 调用另一个异步方法,则这样:
public async Task<bool> MethodAsync()
{
await OtherMethodAsync().ConfigureAwait(false);
}
在等待的方法中再次调用 ConfigureAwait(false) 是否有意义?还是我应该使用默认值 (ConfigureAwait(true))?
谢谢 海梅
每种方法应自行决定是否使用 ConfigureAwait(false)
。如果那个方法需要它的上下文(在这种情况下,HttpContext.Curent
/culture/identity),那么它不应该使用ConfigureAwait(false)
.
记住这段代码:
await MethodAsync().ConfigureAwait(false);
与这段代码大致相同:
var task = MethodAsync();
var configuredTask = task.ConfigureAwait(false);
await configuredTask;
换句话说,MethodAsync
在ConfigureAwait
之前被称为。所以这个方法被调用with当前上下文,然后等待它返回的任务没有捕获上下文。