最初,我在MVC Razor应用程序中遇到以下错误的问题(在完成加载页面之前两次单击某些选项时):


  在此之前的上下文中,第二个操作已开始
  异步操作完成。使用“等待”来确保任何
  异步操作已在调用另一个方法之前完成
  在这种情况下。不保证任何实例成员都是线程
  安全。


因此,我开始按照MS的建议使用异步方法。这涉及在多个控制器操作中进行级联异步更改(将async的实现方式类似于“僵尸病毒”的传播方式,我倾向于同意)。

我仍然在注入的CurrentCandidate类中使用以下异步方法收到该错误:

    public async Task<ApplicationUser> ApplicationUserAsync()
    {
        var applicationUser = await this._userManager.FindByIdAsync(HttpContext.Current.User.Identity.GetUserId());
        return applicationUser;
    }


大概是因为HttpContext.Current.User.Identity.GetUserId()在后台运行了一些异步操作。

我以为是MS lib,因为它是GetUserId()的异步版本,但是我找不到一个(或任何文档说它存在)

我在这里有什么选择?我受到同事的压力,要求他们完全放弃async方法,但这只会在另一个地方导致相同的错误。

有什么建议吗?

更新:

将两个呼叫分隔到单独的行中可以得到更清晰的画面。崩溃在FindByIdAsync()上:

    public async Task<ApplicationUser> ApplicationUserAsync()
    {
        var id = HttpContext.Current.User.Identity.GetUserId();
        var applicationUser = await this._userManager.FindByIdAsync(id); <<<< crashes here
        return applicationUser;
    }

最佳答案

HttpContext.Current.User.Identity.GetUserId()没有异步版本。 GetUserId未连接到EF或任何异步操作。这是源代码:https://aspnetidentity.codeplex.com/SourceControl/latest#src/Microsoft.AspNet.Identity.Core/Extensions/IdentityExtensions.cs
它所做的只是进入cookie数据并获取与UserId相关的声明值。

因此,您需要找到其他引起问题的操作。

关于c# - Identity Framework中是否有GetUserIdAsync()?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28830266/

10-13 08:15