Kom i gang med asynkron programmering

Fuldført

Udviklere bruger asynkrone programmeringsteknikker til at undgå flaskehalse i ydeevnen og forbedre programmernes overordnede svartid. Traditionelle teknikker til at skrive asynkrone programmer kan dog være komplicerede, hvilket gør dem svære at skrive, foretage fejlfinding og vedligeholde.

C# understøtter en forenklet asynkron programmeringstilgang, der udnytter asynkron support i .NET-kørslen. Compileren udfører det svære arbejde, som udvikleren plejede at udføre, og dit program bevarer en logisk struktur, der ligner synkron kode. Derfor får du alle fordelene ved asynkron programmering med en brøkdel af indsatsen.

Hvis du forstår, hvordan asynkrone processer fungerer i den virkelige verden, kan det hjælpe dig med at forstå, hvordan du bruger asynkron programmering i dine programmer.

Undersøg en asynkron proces i den virkelige verden

At lave morgenmad er et godt eksempel på en proces, der drager fordel af at udføre opgaver asynkront. Du kan tænke på at lave morgenmad som en række opgaver, der kan udføres enten synkront eller asynkront.

  1. Få morgenmadsingredienserne fra spisekammeret.
  2. Hæld en kop kaffe.
  3. Varm en pande, og steg derefter tre skiver bacon.
  4. Steg to æg.
  5. Toast to stykker brød.
  6. Spred smør og marmelade på toasten.
  7. Hæld et glas appelsinjuice.

Hvis du har erfaring med madlavning, kan du fuldføre disse instruktioner asynkront. Du starter panden opvarmning for bacon og æg, og derefter få ingredienserne fra pantry. Du sætter brødet i brødet og begynder derefter at tilberede baconet. På hvert trin i processen starter du en opgave og skifter derefter til andre opgaver, der er klar til din opmærksomhed.

Madlavning morgenmad er et godt eksempel på asynkront arbejde, der ikke er parallel. Én person (eller tråd) kan håndtere alle opgaverne. Én person kan foretage morgenmad asynkront ved at starte den næste opgave, før den forrige opgave er fuldført. Hver madlavningsopgave skrider frem, uanset om nogen aktivt ser processen. Så snart du begynder at opvarme panden, kan du få ingredienser fra pantry. Når baconet begynder at lave mad, kan du sætte brødet i brødristeren.

Hvis du vil have en parallel algoritme, skal du bruge flere personer, der laver mad (eller flere tråde). En person koger æggene, en anden frites bacon, og så videre. Hver person fokuserer på sin specifikke opgave. Hver person, der er madlavning (eller hver tråd) er blokeret synkront venter på den aktuelle opgave til at fuldføre: Bacon klar til flip, brød klar til pop op i brødristeren, og så videre.

Ved hjælp af asynkrone programmeringsteknikker kan du forbedre effektiviteten og reaktionsevnen i din app på samme måde som ved at gøre morgenmaden mere effektiv ved at udføre flere opgaver på én gang.

Async forbedrer svartid

Asynkron er vigtig for aktiviteter, der muligvis blokerer, f.eks. webadgang. Adgangen til en webressource er nogle gange langsom eller forsinket. Hvis en sådan aktivitet er blokeret i en synkron proces, skal hele programmet vente. I en asynkron proces kan programmet fortsætte med andet arbejde, der ikke afhænger af webressourcen, før den potentielt blokerende opgave er afsluttet.

I følgende tabel vises typiske områder, hvor asynkron programmering forbedrer svartid. De angivne API'er fra .NET og Windows Runtime indeholder metoder, der understøtter asynkron programmering.

Programområde .NET Typer med asynkrone metoder Windows Runtime-typer med asynkrone metoder
Webadgang HttpClient Windows.Web.Http.HttpClient, SyndicationClient
Arbejde med filer JsonSerializer, StreamReader, StreamWriter osv. StorageFile
Arbejde med billeder MediaCapture, BitmapEncoder, BitmapDecoder
WCF-programmering Synkrone og asynkrone handlinger

Sådan opretter og kalder du asynkrone metoder

I C#implementeres asynkrone handlinger ved hjælp af nøgleordene async og await . Nøgleordet async bruges til at definere en asynkron metode, mens nøgleordet await bruges til at kalde en asynkron metode og vente på resultatet uden at blokere den kaldende tråd. De asynkrone handlinger implementeres typisk ved hjælp af typerne Task eller Task<T> , som repræsenterer en igangværende handling, der kan ventes.

Her er et eksempel på, hvordan du opretter og kalder en asynkron opgave i 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;
        }
    }
}

I dette eksempel ReadFileAsync er metoden defineret ved hjælp af nøgleordet async og har returtypen Task<string>. Nøgleordet async angiver, at metoden indeholder asynkrone handlinger, og returtypen for Task<string> angiver, at metoden returnerer en opgave, der repræsenterer den asynkrone handling. Typen Task<string> er en generisk opgave, der repræsenterer en asynkron handling, der returnerer en strengværdi. Metoden ReadFileAsync bruger en filsti som parameter og læser indholdet af filen asynkront.

Metoden Main er også defineret som asynkron, så den kan kalde metoden ReadFileAsync ved hjælp af nøgleordet await . Nøgleordet await bruges til at angive, at programmet skal vente på resultatet af den asynkrone handling, før du fortsætter. I dette tilfælde venter programmet på, at filen læses, før indholdet udskrives i konsollen.

Resumé

I dette undermodul har du lært om fordelene ved asynkron programmering, og hvordan det kan forbedre dine programmers svartid. Du har også lært, hvordan du opretter og kalder asynkrone metoder ved hjælp af nøgleordene async og await i C#. Ved hjælp af disse teknikker kan du skrive mere effektive og dynamiske programmer, der kan håndtere potentielt blokerende handlinger uden at fryse brugergrænsefladen eller blokere andre opgaver.

Nøglepunkter

  • Asynkron programmering forbedrer programmets ydeevne og svartid.
  • C# giver en forenklet tilgang til asynkron programmering.
  • Asynkron programmering er nyttigt i forbindelse med potentielt blokerende aktiviteter, f.eks. webadgang.
  • I C#oprettes asynkrone metoder ved hjælp af nøgleordet async og kaldes ved hjælp af nøgleordet await .
  • Typerne Task eller Task<T> repræsenterer igangværende handlinger, der kan ventes i C#.