C# Academy · Lektion

Task/ValueTask og den asynkrone tilstandsmaskine (koncepter)

Forstå Task-resultater og idéen bag den asynkrone tilstandsmaskine. Skriv små asynkrone metoder, kombinér awaits, og se en manuel TaskCompletionSource.

Lektion 1 af 38 trin

Task/ValueTask og den asynkrone tilstandsmaskine (koncepter) er en gratis C# Academy-lektion på CoddyKit. Dette er lektion 1 af 3. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i C# Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. C# Academy-kurset indeholder 3 lektioner i alt.

Tankemodel

Mål: Opbyg en intuitiv forståelse af async.

  • Task repræsenterer igangværende arbejde og et fremtidigt resultat
  • await sætter arbejdet på pause og genoptager det senere
  • Kompilatoren opretter en tilstandsmaskine
  • ValueTask: nyere optimering (kun konceptet gennemgås her)

Grundlæggende om async-metoder

En async-metode returnerer straks Task<T>; senere fuldføres den med værdien, når det afventede arbejde er færdigt.

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);
  }
}

Sammensætning af await-kald

Med await kan du skrive sekventielle async-trin i en klar stil fra top til bund.

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);
  }
}

Idéen bag tilstandsmaskinen

Koncept: Kompilatoren omdanner en async-metode til en tilstandsmaskine.

  • Lokale variabler gemmes som felter
  • Hvert await fører til en ny tilstand
  • Når den afventede Task fuldføres, genoptager en fortsættelse metoden
  • Undtagelser opsamles og sættes på Task'en

Demonstration af TaskCompletionSource

TaskCompletionSource lader dig oprette en Task og markere dens fuldførelse senere; await bruger den som enhver anden 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-konceptet

ValueTask (koncept): en nyere returtype, der sparer allokeringer, til resultater, der ofte er synkrone.

  • Nyttig, når resultaterne for det meste allerede er tilgængelige
  • Har regler, der undgår ekstra allokeringer
  • Findes ikke i C# 6 – brug Task her; idéerne gælder stadig

Asynkron tilstandsmaskine

Hurtigt tjek: Hvad genererer C#-kompilatoren for en async-metode, der bruger await?

Opsummering

Opsummering: Task modellerer arbejde; await sætter det på pause og genoptager det; kompilatoren opbygger en tilstandsmaskine. ValueTask er et optimeringskoncept (brug Task i C# 6).

Gratis at komme i gang

Lær C# med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
93
Lektioner
346

Ofte stillede spørgsmål

Er lektionen “Task/ValueTask og den asynkrone tilstandsmaskine (koncepter)” gratis?

Ja — hele teksten til “Task/ValueTask og den asynkrone tilstandsmaskine (koncepter)” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af C# Academy-kurset, skal du opgradere til CoddyKit PRO. C# Academy-kurset indeholder 3 lektioner i alt.

Hvad lærer jeg i “Task/ValueTask og den asynkrone tilstandsmaskine (koncepter)”?

Forstå Task-resultater og idéen bag den asynkrone tilstandsmaskine. Skriv små asynkrone metoder, kombinér awaits, og se en manuel TaskCompletionSource. Du øver dig i C# Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på C# Academy?

Der kræves ingen tidligere erfaring. C# Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 1 af 3.

Hvor lang tid tager lektionen “Task/ValueTask og den asynkrone tilstandsmaskine (koncepter)”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne C# Academy-lektion?

Ja. Alle C# Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Task/ValueTask og den asynkrone tilstandsmaskine (koncepter)
  2. Asynkrone faldgruber: sync-over-async og deadlocks
  3. ConfigureAwait og exception flow
← Tilbage til C# Academy