2017-03-10 17 views
2

私は非同期メソッドのロジックを知っていますが、以下のメソッドが私にどのように利点を与えるのか理解できません。次の非同期メソッドは同期メソッドと異なりますか?非同期アクション - MVC

[HttpPost] 
[AllowAnonymous] 
[ValidateAntiForgeryToken] 
public async Task<ActionResult> ExternalLoginConfirmation(ExternalLoginConfirmationViewModel model, string returnUrl) 
{ 
    if (User.Identity.IsAuthenticated) 
    { 
     return RedirectToAction("Index", "Manage"); 
    } 

    if (ModelState.IsValid) 
    { 
     var info = await AuthenticationManager.GetExternalLoginInfoAsync(); 
     if (info == null) 
     { 
      return View("ExternalLoginFailure"); 
     } 
     var user = new ApplicationUser { UserName = model.Email, Email = model.Email }; 
     var result = await UserManager.CreateAsync(user); 
     if (result.Succeeded) 
     { 
      result = await UserManager.AddLoginAsync(user.Id, info.Login); 
      if (result.Succeeded) 
      { 
       await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false); 
       return RedirectToLocal(returnUrl); 
      } 
     } 
     AddErrors(result); 
    } 

    ViewBag.ReturnUrl = returnUrl; 
    return View(model); 
} 
+2

はい。データベースが応答するのを待っているスレッドをブロッキング*する代わりに、サーバーは他の作業のためにスレッドを解放します。データベースが応答すると、サーバは 'await'の後に処理を開始します。適度なトラフィックを持つWebサーバーでは、同じ数のスレッドでより多くの要求をサーバーにすることができます。 –

+2

パフォーマンスモニタからわかるように、ブロック操作がno-opsではないため、CPU使用率も低下します。一方では、スレッドがスリープする前にスピンウェイトでブロッキング操作が開始され、CPUが無駄になります。一方、OSは、どのスリープ解除スレッドがブロック解除されたのかを調べる必要があります。したがって、何もないCPU負荷が発生する –

+2

要するに、非同期操作により、同じハードウェアからより多くの要求を処理できます。 –

答えて

2

この習慣の利点を理解するには、まずASP.NETライフサイクルの仕組みを理解する必要があります。

私たちがサーバーに要求するたびに、パイプラインはそれを処理するためにスレッドプールスレッドを取得します。また、すべてのリソースと同様に、この目的のためにスレッドプール内で使用できるスレッドの数に制限があります。

I/O操作やデータベース操作などの操作によっては、一般的に処理がブロックされ、予想よりも長く持続します。

パイプラインが使用可能なリソースの制限に達すると、新しい要求を処理できるようにパイプラインの一部が解放されるまで待つだけです。

ランタイムは、内部的な処理のためにアクションを取得すると、これらのタスクを非同期に処理して、前のスレッドがブロックされている間に別の要求を処理するスレッドプールスレッドを解放します。これは一般に、利用可能な同じリソースを使用して、個々の要求ごとにわずかに高い処理コストを犠牲にして、全体的なスループットを向上させます。

Here簡単な説明です。

私はそれがあなたを助けることを願っています。

2

非同期メソッドは、クライアントの観点からは何も変わりません。これは通常のhttpコール(要求を完了するのにほぼ同じ時間)です。しかし、あなたはあなたのWebサーバー上でより良いスケールを得るでしょう。

コード内の次の行の場合、非同期操作が進行中の場合は常にワーカースレッド(処理要求)がスレッドプールに返されます。そのスレッドは、次のリクエストを処理することは自由です。非同期操作が完了すると、スレッドはさらに処理するためにスレッドプールから選択されます。

var info = await AuthenticationManager.GetExternalLoginInfoAsync(); 

result = await UserManager.AddLoginAsync(user.Id, info.Login); 

// and other async methods 

これをテストするには、非同期コントローラと同期コントローラのサービス呼び出しの数をこのapiとクロスチェックで測定できます。詳細については

https://docs.microsoft.com/en-us/aspnet/mvc/overview/performance/using-asynchronous-methods-in-aspnet-mvc-4

は、このヘルプを願っています。

関連する問題