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!