• 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?

Object Storage Arubacloud
0 głosów
245 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 45 wizyt
pytanie zadane 4 marca w C# przez drewienko Nowicjusz (120 p.)
0 głosów
2 odpowiedzi 900 wizyt
pytanie zadane 15 sierpnia 2019 w C# przez Szaradek Obywatel (1,340 p.)
0 głosów
0 odpowiedzi 298 wizyt

92,551 zapytań

141,393 odpowiedzi

319,523 komentarzy

61,936 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...