Task/ValueTask ja async-tilakone (käsitteet)
Ymmärtäkää Task-tulokset ja async-tilakoneen idea. Kirjoittakaa pieniä asynkronisia menetelmiä, koostakaa await-kutsuja ja tutustukaa manuaaliseen TaskCompletionSource-lähestymistapaan.
Task/ValueTask ja async-tilakone (käsitteet) on ilmainen C# Academy-oppitunti CoddyKitissä. Tämä on oppitunti 1/3. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu C# Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. C# Academy-kurssilla on yhteensä 3 oppituntia.
Ajattelumalli
Tavoite: Muodostakaa intuitiivinen käsitys asynkronisuudesta.
- Task edustaa käynnissä olevaa työtä ja tulevaa tulosta
- await keskeyttää suorituksen ja jatkaa sitä myöhemmin
- Kääntäjä luo tilakoneen
- ValueTask: uudempi optimointi (tässä vain käsitteenä)
Asynkronisen metodin perusteet
async-metodi palauttaa Task<T>-olion heti; myöhemmin se valmistuu arvon kanssa, kun awaitilla odotettu työ päättyy.
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);
}
}
Await-kutsujen yhdistäminen
Await mahdollistaa peräkkäisten asynkronisten vaiheiden kirjoittamisen selkeällä ylhäältä alas etenevällä tyylillä.
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);
}
}
Tilakoneen idea
Käsite: Kääntäjä muuntaa async-metodin tilakoneeksi.
- Paikalliset muuttujat tallennetaan kentiksi
- Jokainen await siirtää suorituksen uuteen tilaan
- Kun odotettu Task valmistuu, jatkotoiminto jatkaa metodin suoritusta
- Poikkeukset kaapataan ja asetetaan Taskiin
TaskCompletionSource-esimerkki
TaskCompletionSource mahdollistaa Taskin luomisen ja sen valmistumisesta ilmoittamisen myöhemmin; await käyttää sitä kuten mitä tahansa muuta Taskia.
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-käsite
ValueTask (käsite): uudempi muistivarauksia säästävä palautustyyppi usein synkronisesti valmistuville tuloksille.
- Hyödyllinen, kun tulokset ovat useimmiten jo saatavilla
- Siihen liittyy sääntöjä ylimääräisten muistivarausten välttämiseksi
- Ei käytettävissä C# 6:ssa — käyttäkää tässä Task-tyyppiä; samat ideat pätevät silti
Asynkroninen tilakone
Yhteenveto
Yhteenveto: Task mallintaa työn; await keskeyttää suorituksen ja jatkaa sitä; kääntäjä rakentaa tilakoneen. ValueTask on optimointiin liittyvä käsite (käyttäkää C# 6:ssa Taskia).
Opi C# tekoälytuutorin avulla — ilmaiseksi
Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.
- Kurssit
- 93
- Oppitunnit
- 346
Usein kysytyt kysymykset
Onko oppitunti ”Task/ValueTask ja async-tilakone (käsitteet)” ilmainen?
Kyllä – oppitunnin ”Task/ValueTask ja async-tilakone (käsitteet)” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko C# Academy-kurssin, päivitä CoddyKit PROhon. C# Academy-kurssilla on yhteensä 3 oppituntia.
Mitä opin oppitunnilla ”Task/ValueTask ja async-tilakone (käsitteet)”?
Ymmärtäkää Task-tulokset ja async-tilakoneen idea. Kirjoittakaa pieniä asynkronisia menetelmiä, koostakaa await-kutsuja ja tutustukaa manuaaliseen TaskCompletionSource-lähestymistapaan. Harjoittelet C# Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.
Tarvitsenko kokemusta aloittaakseni C# Academy-opiskelun?
Aiempi kokemus ei ole tarpeen. CoddyKitin C# Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 1/3.
Kuinka kauan ”Task/ValueTask ja async-tilakone (käsitteet)”-oppitunnin suorittaminen kestää?
Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.
Voinko kirjoittaa ja suorittaa koodia tällä C# Academy-oppitunnilla?
Kyllä. Jokainen C# Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.
Kaikki tämän kurssin oppitunnit
- Task/ValueTask ja async-tilakone (käsitteet)
- Async-sudenkuopat: sync-over-async ja lukkiutumiset
- ConfigureAwait ja poikkeusten kulku