Vijf verdiepende inzichten in asynchroon programmeren met .NET
Asynchroon programmeren is niet meer weg te denken uit moderne .NET-development. Veel ontwikkelaars gebruiken async en await dagelijks.
Collega Jarne Van Aerde deelt vijf interessante inzichten die je kennis over asynchroon programmeren naar een hoger niveau tillen.
1. Async/await: niet altijd nodig
Bij het aanroepen van een asynchrone methode schrijven we vaak automatisch async en await. Maar wist je dat dit niet altijd noodzakelijk is? Als je direct het resultaat teruggeeft zonder er iets mee te doen, kun je de async/await weglaten. Dit levert zelfs betere prestaties op omdat er geen state machine wordt aangemaakt.
2. Eleganter omgaan met parallelle taken
.NET 9 introduceert Task.WhenEach – een nieuwe manier om met meerdere parallelle taken om te gaan. Hiermee kun je direct reageren zodra een task is afgerond. Hiervoor was het veel complexer om te kijken of een bepaalde task was afgerond.
3. De impact van ConfigureAwait
Het gebruik van ConfigureAwait heeft grote invloed op waar je code wordt uitgevoerd. Vooral bij UI-applicaties is dit cruciaal, omdat UI-updates op de juiste thread moeten gebeuren. De standaardwaarde true is vaak de veilige keuze, maar in libraries kan ConfigureAwait(false) de prestaties verbeteren. Dit kan nodig zijn als je iets op de UI-thread moet uitvoeren, bijvoorbeeld bij WPF-applicaties; je wil dan garanderen dat de executie doorgaat op dezelfde thread, namelijk de UI-thread. Door de waarde op false te zetten geef je .NET de keuze op welke thread de rest van je code wordt uitgevoerd nadat een await heeft plaatsgevonden.
4. Sync en async veilig combineren
Soms moet je asynchrone code toch synchroon uitvoeren. Als dit nodig is, gebruik dan Task.GetAwaiter().GetResult(). Dit geeft duidelijkere foutmeldingen dan alternatieven zoals Task.Wait() of Task.Result als je exceptions wilt opvangen.
5. Voorkom thread-blokkering met Task.Yield
In specifieke scenario’s waar continue loops threads kunnen blokkeren, kan het voorkomen dat andere delen van je applicatie geen thread tot hun beschikking krijgen om hun werk te verrichten. Hier biedt Task.Yield() uitkomst. Het zorgt ervoor dat de huidige thread wordt vrijgegeven voor andere taken.
Benieuwd naar de concrete code voorbeelden en benchmark resultaten? In het uitgebreide Engelstalige artikel van Jarne vind je diepgaande uitleg, praktische voorbeelden en code samples voor elk van deze concepten.