在这种情况下,使用ConfigureAwait(false)是否正确?

时间:2015-08-11 16:06:35

标签: asynchronous oauth-2.0 async-await owin

我有一个ASP.NET MVC应用程序和 我有一个用于身份验证的OAuth请求资源所有者密码流,如下所示:

public override async Task GrantResourceOwnerCredentials(
    OAuthGrantResourceOwnerCredentialsContext context)
{
    var userManager = (CustomUserManager)context.OwinContext.Get<>();
    var user = await userManager 
        .FindAsync(context.UserName, context.Password)
        .ConfigureAwait(false)
    var ticket = new AuthenticationTicket(identity, properties);    
    context.Validated(ticket);
}

问题是:如果我没有ConfigureAwait(false),我正在设置死锁并且Task被取消了异常。 但是使用ConfigureAwait(false),一切正常。

但我的问题是在这种情况下使用ConfigureAwait(false)是否正确? 在这种情况下,可以使用ConfigureAwait(false)丢失上下文吗?

提前致谢。

1 个答案:

答案 0 :(得分:1)

如果堆栈中的某些内容阻塞了异步代码,它应该只会死锁。可能是一个MVC过滤器,因为那些不能(还)是异步的。

只要ConfigureAwait(false)构造函数和AuthenticationTicket可以在ASP.NET请求上下文之外运行,就可以使用AuthenticationTicket.Validated作为解决方法。我不知道他们能不能。

请注意,此时此类黑客攻击是短暂的; ASP.NET vNext将支持异步MVC动作过滤器,然后代码可以完全异步。