31
Vývoj / Re:Pomoc s Reflexí v C#
« kdy: 17. 11. 2018, 13:46:18 »...
Uplne "uvnitr" vsech await volani musi byt volani metody cca Task MojeAsyncMetoda() { return Task.Run(() => muj_hrozny_vypocet());} .
Omlouvám se za trochu offtopic, ale nedá mi to.
Výše napsané není pravda a je to podle mně jeden z těch méně vhodných příkladů jak Async/Await používat/implementovat.
Ve zkratce:
Pro CPU bound tasky async/await nemá moc smysl, respektive výhody.
Naopak u IO to dává async/await velký smysl, pokud se tedy úplně "uvnitř" použijí "nativní" async I/O funkce (na místo Task.Run( .. synchroní I/O ..). Umožňuje to mít spuštěno najednou více tasků než je (najednou) využito vláken což šetří zdroje.
Také je dobré si pamatovat že samotné await/await nevynucuje to že práce bude provedena v jiném vlákně(i když to tak někdy může dopadnout). Do hry tu vstupuje koncept SynchronizationContext (kde lze například vynutit že vše bude bude probíhat pouze v jednom vlákně).
Jiný pohled, z hlediska i/o: pokud čteme ze socketu a data jsou již přijata, tak předávat práci(čtení ze socketu do bufferu) "na jiné vlákno" není zrovna hospodárné, proto se čtení se může provést synchroně, a to i včetně potenciálně CPU bound kódu který za povelem na čtení následuje.
Popsat všechny výhody/nevýhody z různých pohledů, to je jistě na několik článků a doporučuji googlit.
Ale ani ofici8ln9 dokumentace není pro začátek špatná, třeba : https://docs.microsoft.com/cs-cz/dotnet/csharp/programming-guide/concepts/async/index
ale no tak