web-dev-qa-db-ja.com

MVC5で非同期を使用する利点は何ですか?

違いは何ですか:

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コードには現在非同期がありますが、違いは何ですか。一方が他方よりもはるかに優れたパフォーマンスを発揮しますか一方の問題を他方の問題よりもデバッグしやすいですか?アプリケーションが非同期を追加するために、他のコントローラーに変更を加える必要がありますか?

116
user1943020

非同期アクションは、リモートサーバー呼び出しなどの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がある場合にのみ非同期アクションを使用してください。非同期アクション内でブロッキング呼び出しを行うと、そのすべての利点が失われます。

165
Darin Dimitrov

通常、単一のHTTP要求は単一のスレッドで処理され、応答が返されるまでそのスレッドをプールから完全に削除します。 TPLでは、この制約に拘束されません。入ってくる要求は、プール内の任意のスレッドで実行できる応答を計算するために必要な各計算単位で継続を開始します。このモデルを使用すると、標準のASP.Netよりも多くの同時要求を処理できます。

生成される新しいタスクであるかどうか、および待機する必要があるかどうか。約70ミリ秒を常に考慮してください。最大メソッド呼び出しにかかる時間。長い場合は、UIの応答性があまり高くない可能性があります。

2

起動時に多数の同時リクエストが発生するか、バースト負荷がかかる(同時実行性が急激に増加する)Webアプリケーションでは、これらのWebサービス呼び出しを非同期にすると、アプリケーションの応答性が向上します。非同期リクエストの処理には、同期リクエストと同じ時間がかかります。たとえば、リクエストが完了するのに2秒を必要とするWebサービス呼び出しを行う場合、リクエストは同期または非同期のどちらで実行されても2秒かかります。ただし、非同期呼び出し中、スレッドは、最初の要求が完了するまで待機している間、他の要求への応答をブロックされません。したがって、非同期要求は、長時間実行される操作を呼び出す同時要求が多数ある場合、要求のキューイングとスレッドプールの増大を防ぎます。

0
Muhammad Essa