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.
Párhuzamosan? Nem async-kel.
Thread-et használj.
Az aszinkron függvény annyit tesz, hogy fut ugyanúgy tovább a program (nem várja meg a függvény visszatérését), és amikor az visszatért, akkor dolgozza fel. Ezt arra használják többnyire, hogy egy időigényes folyamat ne fagyassza ki a grafikus felületet: például internetről kéne betöltenie adatot, az akár több másodperc is lehet, ennyi időre meg nem éppen bölcs dolog megfagyasztani a programot.
Az async/await lényege, hogy a befejezés előtt visszaadja a vezérlést a hívó félnek.
Példa:
async Task szamol() {
var ebbenLeszAzEredmeny = valamilyenAsyncFuggveny();
Int32 eredmeny1 = bonyolultFuggveny();
Int32 eredmeny2 = await ebbenLeszAzEredmeny;
}
Ebben az esetben amíg számolod az eredmeny1-et, addig párhuzamos számolsz az async függvényben is. Az await azért kell .Result vagy .Wait() helyett, mert azt szeretnéd, hogy amíg vársz az eredmeny2-re, addig az, aki hívta a szamol() függvényt, az ugyanilyen mintázat alapján addig tudjon számolni bármi mást. És ezt tetszőleges mélységben/szélességben eljátszhatod.
“ Egyébként harmadikféleképpen is kipróbáltam, és úgyse halad párhuzamosan az async, hanem megvárja.”
Erre a háromféle módra lennék kiváncsi.
Egészen biztos, hogy meg tudnánk mondani, hogy kell átírni olyanra, hogy párhuzamosan fusson, és hogy mire való az async.
https://pastebin (pont) com/cxW2GpW0
Még az a kettő, amit a Main()-ből hívok, érthető, hogy miért egymás után fut - mert közvetlenül ott van az await. Már ha egyáltalán ezt jól gondolom. :D
De a FooAsync() esetén a végén van az await, mégse fut le odáig párhuzamosan a Foo2Async()-kel.
Körülbelül azt várnám, hogy a 2 for ciklus kiírásai keveredjenek egymással, vagy legalábbis az előtte-utána levő egyéb kiírások keveredjenek.
Ráadásul előzőleg a FooAsync-ban nem for ciklus volt, hanem 3 db Console.WriteLine(). Na azok is a Foo2Async() visszatérése után futottak le.
Nem tudom, az await Task.FromResult()-ok megzavarják-e. De ha meg azok zavarják meg, akkor azt nem értm, hogy őnekik miközük az őket tartalmazó metódust hívó másik metódushoz.
Kérlek, ne azt nézzétek, hogy értelmes-e a kód - értelmetlen, hiszen csak az async-et szerettem volna nézni vele.
Meg kérlek, ne nézzétek, hogy csúnya. :D
A példádban a következő történik:
- elindul a FooAsync
- FooAsyncon belül elindul a Foo2Async
- fut-fut amíg el nem jut egy await-ig, ahol ténylegesen várakozni kell. Na ilyen nincs a Foo2Async metódusban. (ugye a Task.FromResult az szinkron módon lefutat, mivel csak visszadja az értéket.
Ha kiiíranád a FooAsynban ezt:
Console.WriteLine(num.IsCompleted);
Láthatod, hgoy true-t ír ki. Azaz a Foo2Async itt már lefutott. Ezután fut tovább a FooAsync és be si fejeződik (végig szinkron módon, hisz nem volt szükség várakozásra), tehát hiába await-eled, ugyanaz az eremény, mintha nem await-elted volna a Mainen belül.
Utána indul a AnotherFooAsync, ami szintén szinkron módon fut le.
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!