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());

null プロファイルを返したり、例外をスローしたりしませんでした。したがって、最初の例でぶら下がっているときに何が起こっているのかわかりません。

4

1 に答える 1

9

あなたの最初の例は を使用していたため、私のブログで説明しているデッドロックが発生したと思いResultます。

要約すると、ASP.NET は、一度に 1 つのスレッドのみを許可する「要求コンテキスト」を提供します。を使用してスレッドをブロックするResultと、そのスレッドはそのコンテキストにロックされます。後でFindByIdAsyncそのコンテキストで再開しようとすると、別のスレッドが既にブロックされているため、再開できません。

于 2013-10-30T22:55:33.763 に答える