C# Academy · Oppitunti

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.

Oppitunti 1/38 vaihetta

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

Pikatarkistus: Mitä C#-kääntäjä luo awaitia käyttävälle async-metodille?

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).

Aloita maksutta

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

  1. Task/ValueTask ja async-tilakone (käsitteet)
  2. Async-sudenkuopat: sync-over-async ja lukkiutumiset
  3. ConfigureAwait ja poikkeusten kulku
← Takaisin: C# Academy