Aan de slag met asynchrone programmering
Ontwikkelaars gebruiken asynchrone programmeertechnieken om prestatieknelpunten te voorkomen en de algehele reactiesnelheid van hun toepassingen te verbeteren. Traditionele technieken voor het schrijven van asynchrone toepassingen kunnen echter ingewikkeld zijn, waardoor ze moeilijk kunnen worden geschreven, fouten kunnen worden opgespoord en onderhouden.
C# ondersteunt een vereenvoudigde asynchrone programmeerbenadering die gebruikmaakt van asynchrone ondersteuning in de .NET-runtime. De compiler doet het moeilijke werk dat de ontwikkelaar heeft gebruikt en uw toepassing behoudt een logische structuur die lijkt op synchrone code. Als gevolg hiervan krijgt u alle voordelen van asynchrone programmering met een fractie van de inspanning.
Als u begrijpt hoe asynchrone processen in de praktijk werken, kunt u beter begrijpen hoe u asynchrone programmering in uw toepassingen kunt gebruiken.
Een asynchroon proces in de echte wereld onderzoeken
Het ontbijt is een goed voorbeeld van een proces dat asynchroon profiteert van het uitvoeren van taken. U kunt het ontbijt beschouwen als een reeks taken die synchroon of asynchroon kunnen worden uitgevoerd.
- Haal de ontbijtingrediënten uit de pantry.
- Schenk een kopje koffie in.
- Verwarm een pan en bak vervolgens drie plakjes spek.
- Bak twee eieren.
- Toast twee stukjes brood.
- Spreid boter en jam op de toast.
- Giet een glas sinaasappelsap.
Als u ervaring hebt met koken, kunt u deze instructies asynchroon voltooien. Je begint de pan op te warmen voor het spek en de eieren en haalt vervolgens de ingrediënten uit de voorraadkast. Je zet het brood in het broodrooster en begin met het koken van het spek. Bij elke stap van het proces start u een taak en gaat u over naar andere taken die klaar zijn voor uw aandacht.
Koken ontbijt is een goed voorbeeld van asynchroon werk dat niet parallel is. Eén persoon (of thread) kan alle taken afhandelen. Eén persoon kan het ontbijt asynchroon maken door de volgende taak te starten voordat de vorige taak is voltooid. Elke kooktaak verloopt, ongeacht of iemand het proces actief bekijkt. Zodra je begint met het verwarmen van de pan, kun je ingrediënten uit de pantry halen. Nadat het spek begint te koken, kun je het brood in het broodrooster zetten.
Voor een parallel algoritme hebt u meerdere personen nodig die koken (of meerdere threads). Eén persoon kookt de eieren, een andere friet het spek, enzovoort. Elke persoon richt zich op één specifieke taak. Elke persoon die kookt (of elke draad) wordt synchroon geblokkeerd terwijl ze wachten tot de huidige taak is voltooid: ontbijtspek klaar om om te draaien, brood klaar om uit de broodrooster te springen, enzovoort.
Met behulp van asynchrone programmeertechnieken kunt u de efficiëntie en reactiesnelheid van uw toepassing verbeteren, net zoals hoe u het ontbijt efficiënter kunt maken door meerdere taken tegelijk uit te voeren.
Async verbetert de reactiesnelheid
Asynchroon is essentieel voor activiteiten die mogelijk blokkeren, zoals webtoegang. De toegang tot een webresource is soms traag of vertraagd. Als een dergelijke activiteit wordt geblokkeerd in een synchroon proces, moet de hele toepassing wachten. In een asynchroon proces kan de toepassing doorgaan met ander werk dat niet afhankelijk is van de webresource totdat de potentieel blokkerende taak is voltooid.
In de volgende tabel ziet u typische gebieden waarin asynchrone programmering de reactiesnelheid verbetert. De vermelde API's van .NET en Windows Runtime bevatten methoden die ondersteuning bieden voor asynchrone programmering.
| Toepassingsgebied | .NET-typen met Asynchrone methoden | Windows Runtime-typen met asynchrone methoden |
|---|---|---|
| Webtoegang | HttpClient | Windows.Web.Http.HttpClient, SyndicationClient |
| Werken met bestanden | JsonSerializer, StreamReader, StreamWriter, enzovoort. | StorageFile |
| Werken met afbeeldingen | MediaCapture, BitmapEncoder, BitmapDecoder | |
| WCF-programmering | Synchrone en asynchrone bewerkingen |
Asynchrone methoden maken en aanroepen
In C# worden asynchrone bewerkingen geïmplementeerd met behulp van de async en await trefwoorden. Het async trefwoord wordt gebruikt om een asynchrone methode te definiëren, terwijl het await trefwoord wordt gebruikt om een asynchrone methode aan te roepen en te wachten op het resultaat ervan zonder de aanroepende thread te blokkeren. De asynchrone bewerkingen worden doorgaans geïmplementeerd met behulp van de Task of Task<T> typen, die een doorlopende bewerking vertegenwoordigen die kan worden gewacht.
Hier volgt een voorbeeld van het maken en aanroepen van een asynchrone taak in C#:
using System;
using System.IO;
using System.Threading.Tasks;
public class Program
{
public static async Task Main()
{
string filePath = "example.txt";
string content = await ReadFileAsync(filePath);
Console.WriteLine(content);
}
public static async Task<string> ReadFileAsync(string filePath)
{
using (StreamReader reader = new StreamReader(filePath))
{
string content = await reader.ReadToEndAsync();
return content;
}
}
}
In dit voorbeeld wordt de ReadFileAsync methode gedefinieerd met behulp van het async trefwoord en heeft het een retourtype van Task<string>. Het async trefwoord geeft aan dat de methode asynchrone bewerkingen bevat en het retourtype Task<string> geeft aan dat de methode een taak retourneert die de asynchrone bewerking vertegenwoordigt. Het Task<string> type is een algemene taak die een asynchrone bewerking vertegenwoordigt die een tekenreekswaarde retourneert. De ReadFileAsync methode gebruikt een bestandspad als parameter en leest de inhoud van het bestand asynchroon.
De Main methode wordt ook gedefinieerd als asynchroon, zodat deze de ReadFileAsync methode kan aanroepen met behulp van het await trefwoord. Het await trefwoord wordt gebruikt om aan te geven dat het programma moet wachten op het resultaat van de asynchrone bewerking voordat u doorgaat. In dit geval wacht het programma totdat het bestand wordt gelezen voordat de inhoud naar de console wordt afgedrukt.
Samenvatting
In deze les hebt u geleerd over de voordelen van asynchrone programmering en hoe u hiermee de reactiesnelheid van uw toepassingen kunt verbeteren. U hebt ook geleerd hoe u asynchrone methoden maakt en aanroept met behulp van de async trefwoorden in await C#. Met behulp van deze technieken kunt u efficiëntere en responsievere toepassingen schrijven die mogelijk blokkerende bewerkingen kunnen verwerken zonder de gebruikersinterface te blokkeren of andere taken te blokkeren.
Belangrijkste punten
- Asynchrone programmering verbetert de prestaties en reactiesnelheid van toepassingen.
- C# biedt een vereenvoudigde benadering voor asynchrone programmering.
- Asynchroon programmeren is nuttig bij het blokkeren van activiteiten zoals webtoegang.
- In C# worden asynchrone methoden gemaakt met behulp van het trefwoord
asyncen aangeroepen met het trefwoordawait. - De
TaskofTask<T>typen vertegenwoordigen doorlopende bewerkingen die in C# kunnen worden verwacht.