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.
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
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).
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
- Task/ValueTask og den asynkrone tilstandsmaskinen (konsepter)
- Asynkrone fallgruver: sync-over-async og deadlocks
- ConfigureAwait og exception-flyt