2

我有以下挂起并且从未返回的操作:

public Task<ActionResult> ManageProfile(ManageProfileMessageId? message)
        {
            ViewBag.StatusMessage =
                message == ManageProfileMessageId.ChangeProfileSuccess
                    ? "Your profile has been updated."
                                : message == ManageProfileMessageId.Error
                                      ? "An error has occurred."
                                      : "";
            ViewBag.ReturnUrl = Url.Action("ManageProfile");

            var user = UserManager.FindByIdAsync(User.Identity.GetUserId());
            var profileModel = new UserProfileViewModel
            {
                Email = user.Email,
                City = user.City,
                Country = user.Country
            };

            return View(profileModel);
        }

但是当我把它转换成这个时:

 public async Task<ActionResult> ManageProfile(ManageProfileMessageId? message)
        {
            ViewBag.StatusMessage =
                message == ManageProfileMessageId.ChangeProfileSuccess
                    ? "Your profile has been updated."
                                : message == ManageProfileMessageId.Error
                                      ? "An error has occurred."
                                      : "";
            ViewBag.ReturnUrl = Url.Action("ManageProfile");

            var user = await UserManager.FindByIdAsync(User.Identity.GetUserId());
            var profileModel = new UserProfileViewModel
            {
                Email = user.Email,
                City = user.City,
                Country = user.Country
            };

            return View(profileModel);
        }

它马上就回来了。所以我不确定这是怎么回事?如果它像返回的方法一样简单而无需等待 FindByIdAsync 的结果,那么为什么我没有得到一个没有任何内容的视图。

所以在我看来,它既没有等待返回:

UserManager.FindByIdAsync(User.Identity.GetUserId());

既没有返回空配置文件也没有抛出异常。因此,当它在第一个示例中挂起时,我不明白这里发生了什么。

4

1 回答 1

9

我假设您的第一个示例正在使用Result,因此导致了我在博客上解释的死锁

总之,ASP.NET 提供了一个“请求上下文”,它一次只允许一个线程进入。当您使用 阻塞线程时Result,该线程被锁定在该上下文中。稍后,当FindByIdAsync尝试在该上下文上恢复时,它不能,因为其中已经阻塞了另一个线程。

于 2013-10-30T22:55:33.763 回答