Kezdőoldal » Számítástechnika » Programozás » C# async/await: nem az a...

C# async/await: nem az a lényege, hogy az async method-ok párhuzamosan fussanak egymással?

Figyelt kérdés

[link]


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.



2020. jan. 16. 12:19
1 2 3
 21/23 A kérdező kommentje:
Akkor mit lehet csinálni, hogy egyszerre fussanak?
2020. jan. 19. 17:17
 22/23 anonim ***** válasza:

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.

2020. jan. 20. 23:07
Hasznos számodra ez a válasz?
 23/23 anonim ***** válasza:

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.

2020. jan. 20. 23:51
Hasznos számodra ez a válasz?
1 2 3

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

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!