Het gebruik van await in C#
Binnen applicaties kunnen soms functies voorkomen die lang nodig hebben om te voltooien. Denk bijvoorbeeld aan een call naar een API van een derde partij die veel data teruggeeft die verwerkt moet worden. Het is dan niet gebruiksvriendelijk om te wachten met uitvoeren van andere functionaliteiten totdat de call naar de API klaar is. Dit kan voor problemen zorgen, want het kan dan net lijken of je applicatie is gestopt met werken voor gebruikers van je applicatie. Hoe je dit kunt oplossen, is door het gebruik van await.
Stel, je hebt de volgende code:
In deze functie doe je eerst een call naar een API die data teruggeeft. Daarna gaat een andere functie deze data verwerken. Deze functie duurt lang aangezien het om veel data kan gaan. In de code zoals deze nu is, zal de code wachten tot de lang durende taak is afgerond voordat het de andere functies gaat uitvoeren, ook al hebben de andere functies de verwerkte data niet nodig.
Dit kun je oplossen door await te gebruiken. Met await geef je aan dat een functie uitgevoerd kan worden zonder dat de code wacht tot de functie klaar is. Wel belangrijk, met het gebruik van await wordt er geen nieuwe thread aan maar wordt gebruik gemaakt van dezelfde thread.
Met behulp van het gebruik van await kun je bovenstaande code herschrijven:
Op deze manier zal de code niet blijven hangen op de langdurende functie maar ook nog kunnen reageren op andere input van de gebruiker. De code zal wel wachten met het uitvoeren van nieuwe functies totdat de lange taak af is.
Maar stel nu dat je code meerdere lange taken bevat, zoals onderstaand voorbeeld:
Je wilt hier dat de meerdere asynchrone taken tegelijkertijd worden verwerkt zonder dat de code wacht op een van beide taken. Dit is mogelijk door gebruik te maken van System.Threading.Tasks.Task. Door voor de verschillende functies een Task() aan te maken, zal de code de functie gaan uitvoeren en kun je door middel van await wachten tot de functie klaar is met verwerken en verdergaan met het resultaat van de lange functie. Hier een voorbeeld van hoe dat eruitziet:
Bij het aanmaken van de Task zal de code beginnen met het uitvoeren van de taak. Als de code awai tegenkomt en de functie is nog niet klaar, dan zal de code daar wachten op de functie. Zo wacht je pas op de functie als je de data die de functie teruggeeft ook echt nodig hebt.