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.
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
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).
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
- Task/ValueTask og den asynkrone tilstandsmaskine (koncepter)
- Asynkrone faldgruber: sync-over-async og deadlocks
- ConfigureAwait og exception flow