C# async og await

Tags:    net

Jeg er ved at lære mig selv om async og await, så har taget udgangspunkt i flytning af store filer.

Har taget udgangspunkt i følgende kode:
Fold kodeboks ind/udCSharp kode 


Det som jeg så ville gøre i stedet var:
1) at have en metode til at læse BufferBits ind i en liste.
2) læse BufferBits til en fil.

Således kan en tråd læse, og en tråd skrive for at udnytte processerne bedre.

Problemet er så at min kode soo far bliver afviklet synkront :(

Hjælp mig her.

Fold kodeboks ind/udCSharp kode 




5 svar postet i denne tråd vises herunder
0 indlæg har modtaget i alt 0 karma
Sorter efter stemmer Sorter efter dato
Jeg er ikke vildt stærk i det, men vil mene at du et sted skal definere din task, starte den og så vente:

Fold kodeboks ind/udCSharp kode 





Hej..

Jeg mener ikke at du skal bruge ReadFile(), men ReadFileAsync()



Så vidt jeg har forstået, skal du gøre følgende for at få det async:

Fold kodeboks ind/udCSharp kode 


Det ser ikke ud til at du gør det, men du må aldrig lave "async void" andet end ved eventhandlers. Årsagen her til er, at ved første await returner koden, og forsætter fra hvor den blev kaldt. Derfor kan det være lidt drilsk at lave noget async ved en eventhandler, men det skulle vidst blive ordnet i næste udgave af C#.



Indlæg senest redigeret d. 18.09.2014 09:59 af Bruger #16372
Hej...

Prøv at kigge her:
msdn



Hej...

Prøv at kigge her:
msdn


Nu fik jeg det til at fungere i en console application, men så snart jeg laver det over i en windows application så virker den ikke på samme måde.
Kan godt få den til at arbejde på alle kerner som jeg forventer, men den skriver 16KB og så stopper den ellers.
For mig giver det ikke mening at i en console application kan jeg trykke F5 i mappen og se filstørrelsen vokse, men at fordi den ligger i en forms application så virker det ikke på samme måde?

Problemet er så at jeg kan se jeg får ca 8 gange så høj performance ved at lave det asynkront så det er absolut noget der kan mærkes, MEN det sjove forsvinder ret så hurtigt hvis jeg skal lave et program i et konsol program!

Efter at have prøvet lidt nærmere kan jeg nu se min egen fejl.
I min async metode (ProcessRead) kaldes await, som får den til at blokere til den anden async metode er færdig (ReadTextAsync).
Derfor sætter jeg bare min metode i gang, og programmet fortsætter så asynkront og derfor skriver slut. Den blokerer jo ikke min asynkrone metode (ProcessRead) udenfor, og kan ikke kalde await på den, for min Main i mit konsol program er ikke asynkront og kan ikke blive det.
Løsningen blev at jeg måtte lave et while loop der kunne "holde liv" i min metode og se den køre. Det blev ret tydeligt at det var ret så effektivt.

Har dog stadig brug for lidt mere hjælp, for vil faktisk gerne indlæse en fil i en buffer (Byte[]) imens en anden metode tager fra denne buffer og skriver til en destination. Begge skal ske asynkront simultant så du læser og skriver hele tiden.




Indlæg senest redigeret d. 30.09.2014 23:23 af Bruger #17215
t