1. ホーム
  2. asp.net-mvc

[解決済み] MVC5でasyncを使用するメリットは何ですか?

2022-09-16 18:03:12

質問

とはどのような違いがあるのでしょうか。

public ActionResult Login(LoginViewModel model, string returnUrl)
{
    if (ModelState.IsValid)
    {
        IdentityResult result = IdentityManager.Authentication.CheckPasswordAndSignIn(AuthenticationManager, model.UserName, model.Password, model.RememberMe);
        if (result.Success)
        {
            return Redirect("~/home");
        }
        else
        {
            AddErrors(result);
        }
    }
    return View(model);
}

とする。

[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
{
    if (ModelState.IsValid)
    {
        IdentityResult result = await IdentityManager.Authentication.CheckPasswordAndSignInAsync(AuthenticationManager, model.UserName, model.Password, model.RememberMe);
        if (result.Success)
        {
            return Redirect("~/home");
        }
        else
        {
            AddErrors(result);
        }
    }
    return View(model);
}

MVCのコードに非同期があることがわかりましたが、何が違うのでしょうか。一方は他方よりはるかに良いパフォーマンスを与えますか?一方は他方より問題のデバッグが容易ですか?非同期を追加するために、私のアプリケーションの他のコントローラを変更する必要がありますか?

どのように解決するのですか?

非同期アクションは、リモートサーバー呼び出しなどのI/Oバウンド操作を実行する場合にのみ有効です。非同期呼び出しの利点は、I/O操作の間、ASP.NETワーカスレッドが使用されないことです。では、最初の例でどのように動作するかを説明します。

  1. リクエストがアクションにヒットすると、ASP.NETはスレッドプールからスレッドを取得し、実行を開始します。
  2. IdentityManager.Authentication.CheckPasswordAndSignIn メソッドが呼び出されます。これはブロッキング呼び出しです -> 呼び出しの間中、ワーカスレッドは危険にさらされています。

そして、2番目の呼び出しがどのように動作するかを説明します。

  1. リクエストがアクションにヒットすると、ASP.NETはスレッドプールからスレッドを取得し、実行を開始します。
  2. IdentityManager.Authentication.CheckPasswordAndSignInAsync が呼び出され、すぐに返されます。I/O完了ポートが登録され、ASP.NETワーカスレッドはスレッドプールに解放されます。
  3. 後で操作が完了すると、I/O 完了ポートがシグナルされ、別のスレッドがスレッドプールから引き出されて、ビューの返却を完了します。

2番目のケースでわかるように、ASP.NETワーカスレッドは短時間しか使用されません。これは、他のリクエストに対応するために、プール内に利用可能なスレッドがより多くあることを意味します。

結論として、真の非同期APIを内部に持つ場合にのみ、非同期アクションを使用します。もし、非同期アクションの内部でブロッキングコールをしたら、その利点をすべて失うことになります。