首页 > 解决方案 > 级联ConfigureAwait(false),有必要吗?

问题描述

我正在开发一个 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))?。

谢谢詹姆

标签: async-awaitconfigureawait

解决方案


每种方法都应自行决定是否使用ConfigureAwait(false). 如果该方法需要其上下文(在本例中为HttpContext.Curent/culture / identity),则不应使用ConfigureAwait(false).

请记住,此代码:

await MethodAsync().ConfigureAwait(false);

与此代码大致相同:

var task = MethodAsync();
var configuredTask = task.ConfigureAwait(false);
await configuredTask;

换句话说,MethodAsync被调用before ConfigureAwait。所以该方法在当前上下文中被调用然后它返回的任务被等待而不捕获上下文。


推荐阅读