Jakie są zalety korzystania z async z MVC5?

Jaka jest różnica między:

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

I:

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

Widzę, że kod MVC ma teraz asynchronizację, ale jaka jest różnica. Czy jeden daje dużo lepsze wyniki niż drugi? Czy łatwiej jest debugować problemy z jednym niż drugim? Czy powinienem wprowadzić zmiany w innych kontrolerach, aby moja aplikacja dodała Asynchronizację ?

Author: annemartijn, 2013-09-30

3 answers

Akcje asynchroniczne są użyteczne tylko wtedy, gdy wykonujesz operacje związane z I / O, takie jak zdalne wywołania serwera. Zaletą wywołania asynchronicznego jest to, że podczas operacji We/Wy nie ASP.NET używany jest wątek roboczy. Oto jak działa pierwszy przykład:

  1. gdy żądanie uderza w akcję, ASP.NET pobiera wątek z puli wątków i rozpoczyna jego wykonywanie.
  2. wywoływana jest metoda IdentityManager.Authentication.CheckPasswordAndSignIn. Jest to wywołanie blokujące - > podczas całego wywołania wątek roboczy jest / align = "left" /

A oto jak działa drugie połączenie:

  1. gdy żądanie uderza w akcję, ASP.NET pobiera wątek z puli wątków i rozpoczyna jego wykonywanie.
  2. wywoływany jest IdentityManager.Authentication.CheckPasswordAndSignInAsync, który natychmiast powraca. Rejestrowany jest Port zakończenia We/Wy, a ASP.NET wątek roboczy jest uwalniany do puli wątków.
  3. później, gdy operacja się zakończy, Port zakończenia We/Wy jest sygnalizowany, inny wątek jest rysowany z puli wątków, aby zakończyć zwracanie widok.

Jak widać w drugim przypadku ASP.NET wątki robocze są używane tylko przez krótki okres czasu. Oznacza to, że w puli dostępnych jest więcej wątków do obsługi innych żądań.

Podsumowując, używaj akcji asynchronicznych tylko wtedy, gdy masz prawdziwe asynchroniczne API w środku. Jeśli wykonasz połączenie blokujące wewnątrz akcji asynchronicznej, zabijasz całą jej korzyść.

 159
Author: Darin Dimitrov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-30 06:30:10

Zwykle pojedyncze żądanie HTTP jest obsługiwane przez pojedynczy wątek, całkowicie usuwając ten wątek z puli, dopóki nie zostanie zwrócona odpowiedź. Z TPL nie jesteś związany tym ograniczeniem. Każde żądanie, które się pojawi, rozpoczyna kontynuację z każdą jednostką obliczeniową wymaganą do obliczenia odpowiedzi zdolnej do wykonania na dowolnym wątku w Puli. Dzięki temu modelowi możesz obsłużyć o wiele więcej jednoczesnych żądań niż w przypadku standardowych ASP.Net.

Jeśli jest to jakieś nowe zadanie, które będzie tarło, czy nie, i czy powinno być oczekiwane, czy nie. Zawsze myśl o tych 70 ms, czyli ok. max. czas, który powinien wziąć każdy wywołanie metody. Jeśli jest dłuższy, Twój interfejs najprawdopodobniej nie będzie czuł się bardzo responsywnie.

 1
Author: Gaurang Dhandhukiya,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-22 10:04:04

W aplikacjach webowych, które widzą dużą liczbę jednoczesnych żądań przy starcie lub mają duże obciążenie (gdzie współbieżność nagle wzrasta), asynchroniczne wywołanie tych usług internetowych zwiększy responsywność aplikacji. Przetwarzanie żądania asynchronicznego zajmuje tyle samo czasu, ile żądanie synchroniczne. Na przykład, jeśli żądanie wywołuje usługę sieciową, która wymaga dwóch sekund do wykonania, żądanie to trwa dwie sekundy, niezależnie od tego, czy jest wykonywane synchronicznie, czy asynchronicznie. Jednak podczas asynchronicznego wywołania wątek nie jest blokowany w odpowiedzi na inne żądania, czekając na ukończenie pierwszego żądania. Dlatego też żądania asynchroniczne zapobiegają kolejkowaniu żądań i zwiększaniu puli wątków, gdy istnieje wiele jednoczesnych żądań, które wywołują długotrwałe operacje.

 0
Author: Muhammad Essa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-22 07:24:24