Jen pro upřesnění, klíčová slova async/await je pomůcka na úrovni jazyka C# pro snadnější psaní kódu provádějícího asynchronní volaní a umožnění kompozice více takovýchto volání. Vlastní asynchronní chování je dáno jen operacemi samotnými (v tomto případě metoda ToListAsync) nikoliv těmito klíčovými slovy. Asynchronní operace jako ToListAsync je asynchronní v tom, že při provádění SQL databázového dotazu se (na rozdíl od synchronní varianty) neprovádí blokující čekání na to, než vzdálené volání/SQL server vrátí data (je to tedy podobně jako například asynchronní stahování dat z internetu) a tudíž neblokuje vlákno, které volání provádí. U ASP.NET je to skutečně tak, že po zavolání asynchronní operace je vlákno, které volání provádí, vráceno do thread poolu a může být tedy použito pro obsluhu jiných HTTP requestu. Nicméně threadpool si počet vláken, které jsou k dispozici monitoruje a dynamicky upravuje, takže pokud by bylo hodně přicházejících HTTP requestu a všechna vlákna z treadpoolu by byla blokována (takže prostředky jako CPU by k dispozici byli), tak si počet vláken sám navýší (samozřejmě za cenu jednorázové režie nová vlákna vytvořit), takže by se toho zas tolik nedělo. Z tohoto pohledu není potřeba u ASP.NET aplikace krátké SQL dotazy volat asynchronně. U dlouho trvajících dotazů (500ms a více) bych se ale v praxi naopak v závislosti na tom jaká je zátěž web serveru spíše soustředil na jejich optimalizaci, případně na nějaké cáchování apod., než na to zda se volají asynchronně (to samo osobě moc nepomůže). Samozřejmě bude ale hodně záviset na scénáři, celkové zátěži apod. Jinak ale vlastní režie asynchronního volání u operací jako volání DB dotazu bude v porovnání k vlastní režii zavolání a zpracování SQL dotazu asi zanedbatelná.
|