Webforms async/await   zodpovězená otázka

C#, ASP.NET WebForms

Zdravim,

v poslednej dobe sa snazim porozumiet async/await a potreboval by som pomoc s ozrejmenim nasledovneho:

je nejaky vyznam ak jedinu operaciu, ktora taha data z DB volam asynchronne ? [nedochadza k viacerym DB operaciam v ramci metody]

aby som sa lepsie vyjadril [scenar z webforms]:

RegisterAsyncTask(new PageAsyncTask(async () =>
{
    var x = await db.Tabulka.Where(p => p.UserId == 11).ToListAsync();
}));

vs

var x = db.Tabulka.Where(p => p.UserId == 11).ToList();

Ak tomu spravne chapem, pri async/await pristupe je pocas cakania na odpoved z DB thread schopny spracovavat ine requesty.... ma teda v tomto pripade async/await vyznam aj na DB operaciu, ktora trva povedzme 30ms ? Existuje dlzka exekucie, pri ktorej sa async/await stava kontraproduktivnym? [kvoli rezii na async await]

Dakujem velmi pekne za objasnenie a prajem prijemny den

nahlásit spamnahlásit spam 0 odpovědětodpovědět

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á.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback