asp.net mvc - Qual è il vantaggio dell'uso di async con MVC5?




asp.net-mvc task-parallel-library (2)

Le azioni asincrone sono utili solo quando si eseguono operazioni associate all'I / O come le chiamate al server remoto. Il vantaggio della chiamata asincrona è che durante l'operazione di I / O, non viene utilizzato alcun thread di lavoro ASP.NET. Ecco come funziona il primo esempio:

  1. Quando una richiesta raggiunge l'azione, ASP.NET prende una discussione dal pool di thread e inizia a eseguirla.
  2. Viene richiamato il metodo IdentityManager.Authentication.CheckPasswordAndSignIn . Questa è una chiamata bloccante -> durante l'intera chiamata il thread di lavoro viene messo a repentaglio.

Ed ecco come funziona la seconda chiamata:

  1. Quando una richiesta raggiunge l'azione, ASP.NET prende una discussione dal pool di thread e inizia a eseguirla.
  2. Viene chiamato IdentityManager.Authentication.CheckPasswordAndSignInAsync che restituisce immediatamente. Una porta di completamento I / O è registrata e il thread di lavoro ASP.NET viene rilasciato nel pool di thread.
  3. Successivamente, al termine dell'operazione, viene segnalata la porta di completamento I / O, un altro thread viene estratto dal pool di thread per terminare la restituzione della vista.

Come puoi vedere nel secondo caso i thread di lavoro ASP.NET vengono utilizzati solo per un breve periodo di tempo. Ciò significa che ci sono più thread disponibili nel pool per servire altre richieste.

Quindi, per concludere, usa le azioni asincrone solo quando hai una vera API asincrona all'interno. Se fai una chiamata bloccante all'interno di un'azione asincrona, ne stai uccidendo l'intero beneficio.

Qual è la differenza tra:

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

e:

[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);
}

Vedo che il codice MVC ora ha async ma qual è la differenza. Si danno prestazioni migliori rispetto agli altri? È più facile eseguire il debug dei problemi con uno rispetto all'altro? Devo apportare modifiche ad altri controller per la mia applicazione per aggiungere Async?


Nelle applicazioni Web che vedono un numero elevato di richieste simultanee all'avvio o che hanno un carico esplosivo (in cui la concorrenza aumenta all'improvviso), rendendo tali chiamate di servizio Web asincrone aumenterà la reattività dell'applicazione. Una richiesta asincrona richiede lo stesso tempo per elaborare una richiesta sincrona. Ad esempio, se una richiesta effettua una chiamata al servizio Web che richiede due secondi per il completamento, la richiesta impiega due secondi se viene eseguita in modo sincrono o asincrono. Tuttavia, durante una chiamata asincrona, un thread non viene bloccato dal rispondere ad altre richieste mentre attende la prima richiesta di completamento. Pertanto, le richieste asincrone impediscono l'accodamento delle richieste e la crescita del pool di thread quando vi sono molte richieste simultanee che invocano operazioni a esecuzione prolungata.





asp.net-identity