C# async/await: nem az a lényege, hogy az async method-ok párhuzamosan fussanak egymással?
Próbáltam ezt is megérteni, plusz írtam is egy kis programot.
Thread.Sleep()-et használtam, lehet, hogy ez a probléma?
A lényeg az, hogy nem annyi ideig futott a progim, mint a leghosszabb Thread.Sleep() várakozás, hanem mint a 3 összege. (3 metódust hívtam így). Tehát végeredményben egymás után futottak és nem egyszerre.
Értem, hogy a Thread.Sleep() a current thread-et blokkolja, de nem az az async lényege, hogy a háttérben új thread indul, csak "elfedve", tehát nekünk csak az async-await-re van dolgunk?
A metódusba, ahonnan hívtam ezeket, egyéb kódot is tettem és kiíratást a standard output-ra, de azok se jelentek meg addig, amíg a 3 X Thread.Sleep() ideje le nem telt.
Tessék, ez így egyszerre fut le.
https://pastebin (pont) com/kUhFYrKx
Amennyire én tudom, az async method önmagában nem hoz létre új szálat (threadet), így önmagában az async nem elegendő ahhoz, hogy a dolgok párhuzamosan fussanak/egyszerre történjenek. Ehhez új szálat kell indítani, amit az await Task.Run(() => {...}) módszerrel indítottam, ami végrehajtotta a {} között lévő kódot, de közben visszaadta a vezérlést a fő szálnak, ami el tudta indítani a második async függvényt.
Igazából ezt az async dolgot elég nehéz egy konzolos alkalmazáson szemléltetni, mert ez alapvetően nem arra való, hanem arra, hogyha van egy UI-od, akkor amíg a háttérben egy művelet fut, addig ne fagyjon be/blokkolódjon a UI. Szóval szerintem könnyebben ki tudod próbálni ezt az egészet, ha csinálsz egy egyszerű window-t, rá egy gomb, és a gombon belül hívsz meg egy async függvényt, ami valamit csinál jó sokáig, és látni fogod, hogy közben ugyanúgy tudod birizgálni az ablakot.
Remélem tudtam segíteni.
Illetve itt egy másik, kicsit komplexebb példa is.
https://pastebin (pont) com/VRjg2h7T
Ez az egyik szálon elkezdi kiírni a számokat, közben a másik szálon lekérdezi az index.hu tartalmát és kiírja, majd megvárja, amíg az első szál végez a számok kiiratásával.
Az érdekesség az, hogyha már előre megírt asnyc függvényt használsz, például a HttpClient GetStringAsync() függvényét, akkor abban már benne van, hogy egy új szálat nyit, és neked nem kell még körétenni egy Task.Run(() => {...})-t.
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!