• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

[ASP.NET] Kiedy tworzyć asynchroniczne metody kontrolera?

VPS Starter Arubacloud
0 głosów
299 wizyt
pytanie zadane 9 maja 2021 w C# przez dawid2002 Mądrala (5,190 p.)
edycja 9 maja 2021 przez dawid2002

Cześć wszystkim! Ostatnio rozmyślam nad jednym dylematem - kiedy tworzyć asynchroniczne metody kontrolera a kiedy synchroniczne? Kiedyś spotkałem się z taką opinią, że metody kontrolera powinny być prawie zawsze asynchroniczne ze względu na responsywność serwera, chodzi mi o to, że jeśli będzie dużo żądań to kod synchroniczny może mieć problem, aby to obsłużyć i wątek główny może być zawalony przez te żądania. Oprócz tego spotkałem się jeszcze z taką opinią, że metody te powinny być asynchroniczne wtedy kiedy trzeba użyć słówka await, bądź wielokrotnie czytałem, że powinniśmy używać takich metody gdy mamy do czynienia z operacjami I/O oraz odpytywaniem bazy danych.

Odpowiedź na to pytanie jest mi potrzebna bo ostatnio napisałem taki kod:

public ViewResult Menu(string selectedCategory)
        {
            ViewBag.SelectedCategory = selectedCategory;
            var products = _context.Products;
            var allCategoryAndCount = (ConfigurationManager.AppSettings["all_category_option_name"], products.Count());
            
            IQueryable<(string option, int productsCount)> menuOptionsWithCounts = products
                .AsEnumerable()
                .Select(prod => prod.Category)
                .Distinct()
                .OrderBy(category => category)
                .Select(category => (category, products.Count(prod => prod.Category == category)))
                .Prepend(allCategoryAndCount);
            
            return View(menuOptionsWithCounts);
        }

I teraz nie wiem czy nie przekształcić tego w coś takiego:

public async Task<ViewResult> Menu(string selectedCategory)
        {
            ViewBag.SelectedCategory = selectedCategory;
            var products = this.repository.Products;
            var allCategoryAndCount = (ConfigurationManager.AppSettings["all_category_option_name"], products.Count());
            
            var menuOptionsWithCounts = await products
                .AsEnumerable()
                .Select(prod => prod.Category)
                .Distinct()
                .OrderBy(category => category)
                .Select(category => (category, products.Count(prod => prod.Category == category)))
                .Prepend(allCategoryAndCount)
                .ToListAsync();
            
            return View(menuOptionsWithCounts);
        }

Z góry dzięki za pomoc!

komentarz 9 maja 2021 przez JakSky Stary wyjadacz (14,770 p.)
Metod asynchronicznych używasz, gdy wykonujesz operacje I/O lub długotrwałe prace. Metoda z async, ale bez await jest zwykłą metodą i z metodami asynchronicznymi nie ma nic wspólnego. Musisz użyć słowa await.

1 odpowiedź

0 głosów
odpowiedź 10 maja 2021 przez cava96 Gaduła (3,940 p.)
Warto używać await podczas korzystania z bazy danych, dlaczego ?

Ponieważ gdy mamy jakąś sekwencje zapytań do bazy (np. 2 - 3 zapytania) to w zależności od obciążenia serwera DB wartość 3 może być zwrócona szybciej niż 1 zapytania pomimo, że ono jest nam potrzebne na start

Podobne pytania

0 głosów
0 odpowiedzi 121 wizyt
pytanie zadane 4 marca w C# przez drewienko Nowicjusz (120 p.)
0 głosów
2 odpowiedzi 965 wizyt
pytanie zadane 15 sierpnia 2019 w C# przez Szaradek Obywatel (1,340 p.)
0 głosów
0 odpowiedzi 349 wizyt

92,973 zapytań

141,937 odpowiedzi

321,175 komentarzy

62,301 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...