C# Academy · leksjon

Task/ValueTask og den asynkrone tilstandsmaskinen (konsepter)

Forstå Task-resultater og ideen bak den asynkrone tilstandsmaskinen. Skriv små asynkrone metoder, sett sammen await-uttrykk, og se en manuell TaskCompletionSource.

Leksjon 1 av 38 trinn

Task/ValueTask og den asynkrone tilstandsmaskinen (konsepter) er en gratis leksjon i C# Academy på CoddyKit. Dette er leksjon 1 av 3. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i C# Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i C# Academy inneholder totalt 3 leksjoner.

Mental modell

Mål: Opparbeid en intuitiv forståelse av asynkronitet.

  • Task representerer pågående arbeid og et resultat som kommer senere
  • await setter arbeidet på pause og fortsetter senere
  • Kompilatoren oppretter en tilstandsmaskin
  • ValueTask: en nyere optimalisering (bare konseptet gjennomgås her)

Grunnleggende om asynkrone metoder

En async-metode returnerer Task<T> umiddelbart; senere fullføres den med verdien når arbeidet det ventes på, er ferdig.

using System;
using System.Threading;
using System.Threading.Tasks;

public class Program
{
  // Tiny async method: returns Task<int>
  static async Task<int> GetAnswerAsync()
  {
    // Offload simple work to a thread-pool task (demo only)
    int value = await Task.Run(() =>
    {
      Thread.Sleep(200); // simulate work
      return 42;
    });
    return value; // completes Task<int>
  }

  public static void Main(string[] args)
  {
    // In C# 6, Main cannot be async; block just for demo (console apps are safe here)
    int result = GetAnswerAsync().Result;
    Console.WriteLine("Answer = " + result);
  }
}

Sammensetting av await-uttrykk

Await lar deg skrive sekvensielle asynkrone trinn i en tydelig, trinnvis stil.

using System;
using System.Threading;
using System.Threading.Tasks;

public class Program
{
  static async Task<int> Step1Async()
  {
    // pretend I/O
    await Task.Delay(100);
    return 10;
  }

  static async Task<int> Step2Async(int x)
  {
    await Task.Delay(100);
    return x * 3; // simple transform
  }

  static async Task<int> PipelineAsync()
  {
    int a = await Step1Async();   // await first
    int b = await Step2Async(a);  // then await second
    return a + b;                 // total 10 + 30 = 40
  }

  public static void Main(string[] args)
  {
    int total = PipelineAsync().Result; // block in demo
    Console.WriteLine("Total = " + total);
  }
}

Ideen med tilstandsmaskinen

Konsept: Kompilatoren gjør en async-metode om til en tilstandsmaskin.

  • Lokale variabler lagres som felt
  • Hver await fører til en ny tilstand
  • Når Task-en det ventes på, fullføres, fortsetter en continuation metoden
  • Unntak fanges opp og settes på Task-en

Demonstrasjon av TaskCompletionSource

TaskCompletionSource lar deg opprette en Task og signalisere at den er fullført senere; await bruker den på samme måte som enhver annen Task.

using System;
using System.Threading;
using System.Threading.Tasks;

public class Program
{
  // Emulate an async source that completes later
  static Task<string> MakeTaskManually()
  {
    var tcs = new TaskCompletionSource<string>();
    // Complete on a worker after a short delay
    ThreadPool.QueueUserWorkItem(_ =>
    {
      Thread.Sleep(150);
      tcs.SetResult("done");
    });
    return tcs.Task;
  }

  static async Task<string> UseAsyncSource()
  {
    string s = await MakeTaskManually(); // await a Task you created
    return s.ToUpperInvariant();
  }

  public static void Main(string[] args)
  {
    Console.WriteLine(UseAsyncSource().Result);
  }
}

ValueTask-konseptet

ValueTask (konsept): en nyere returtype som sparer allokeringer for resultater som ofte er synkrone.

  • Nyttig når resultatene er allerede tilgjengelige mesteparten av tiden
  • Har regler som hindrer ekstra allokeringer
  • Er ikke tilgjengelig i C# 6 – bruk Task her; ideene gjelder fortsatt

Asynkron tilstandsmaskin

Hurtigsjekk: Hva genererer C#-kompilatoren for en async-metode som bruker await?

Oppsummering

Oppsummering: Task modellerer arbeid; await setter det på pause og fortsetter senere; kompilatoren bygger en tilstandsmaskin. ValueTask er et optimaliseringskonsept (bruk Task i C# 6).

Gratis å komme i gang

Lær deg C# med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
93
Leksjoner
346

Ofte stilte spørsmål

Er leksjonen «Task/ValueTask og den asynkrone tilstandsmaskinen (konsepter)» gratis?

Ja – hele teksten i «Task/ValueTask og den asynkrone tilstandsmaskinen (konsepter)» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av C# Academy-kurset, kan du oppgradere til CoddyKit PRO. Kurset i C# Academy inneholder totalt 3 leksjoner.

Hva lærer jeg i «Task/ValueTask og den asynkrone tilstandsmaskinen (konsepter)»?

Forstå Task-resultater og ideen bak den asynkrone tilstandsmaskinen. Skriv små asynkrone metoder, sett sammen await-uttrykk, og se en manuell TaskCompletionSource. Du øver på C# Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med C# Academy?

Ingen tidligere erfaring er nødvendig. C# Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 1 av 3.

Hvor lang tid tar leksjonen «Task/ValueTask og den asynkrone tilstandsmaskinen (konsepter)»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne C# Academy-leksjonen?

Ja. Alle C# Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. Task/ValueTask og den asynkrone tilstandsmaskinen (konsepter)
  2. Asynkrone fallgruver: sync-over-async og deadlocks
  3. ConfigureAwait og exception-flyt
← Tilbake til C# Academy