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
 11/23 anonim ***** válasza:

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.

2020. jan. 16. 21:26
Hasznos számodra ez a válasz?
 12/23 anonim ***** válasza:

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.

2020. jan. 17. 08:19
Hasznos számodra ez a válasz?
 13/23 anonim ***** válasza:
Egyébként tudom, hogy itt a teszt miatt direkt akartad várakoztatni a szálat Thread.Sleep-pel, és ebben az estben jó is így, de egyébként pedig normál esetben, ahol tényleg várni kell ne így használd, mert ez feltartja azt a szálat teljesen, hanem await Task.Delay()-t; hívj.
2020. jan. 17. 13:29
Hasznos számodra ez a válasz?
 14/23 A kérdező kommentje:
Fogalmam se volt, hogyan kellene várakoztatni (mármint élesben, nem tesztből), úgyhogy hasznos lehet, köszi! :)
2020. jan. 17. 15:33
 15/23 A kérdező kommentje:
Egyébként harmadikféleképpen is kipróbáltam, és úgyse halad párhuzamosan az async, hanem megvárja.
2020. jan. 17. 15:34
 16/23 anonim ***** válasza:
Amúgy, ha feltöltenél egy példakódot, akkor meg lehetne mondani, hogy hogy kellene átalakítani úgy, hogy úgy fusson, ahogy szeretnéd.
2020. jan. 17. 21:11
Hasznos számodra ez a válasz?
 17/23 anonim ***** válasza:
Alapból nem érti az async, await működését, ehhez milyen kódra van szükséged?
2020. jan. 17. 22:36
Hasznos számodra ez a válasz?
 18/23 anonim ***** válasza:

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

2020. jan. 17. 23:01
Hasznos számodra ez a válasz?
 19/23 A kérdező kommentje:

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

2020. jan. 19. 13:41
 20/23 anonim ***** válasza:

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.

2020. jan. 19. 16:58
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!