C# Academy · Lekcja

Task/ValueTask i maszyna stanów async (koncepcje)

Proszę zrozumieć wyniki Task i ideę maszyny stanów async. Proszę pisać małe metody asynchroniczne, komponować wyrażenia await oraz poznać ręczne użycie TaskCompletionSource.

Lekcja 1 z 38 kroki

Task/ValueTask i maszyna stanów async (koncepcje) to bezpłatna lekcja C# Academy na CoddyKit. To lekcja 1 z 3. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej C# Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs C# Academy zawiera 3 lekcji w sumie.

Model mentalny

Cel: Zbudowanie intuicji dotyczącej programowania asynchronicznego.

  • Task reprezentuje trwającą pracę i przyszły wynik
  • await wstrzymuje wykonanie, a następnie je wznawia
  • Kompilator tworzy maszynę stanów
  • ValueTask: nowsza optymalizacja (omówiona tu tylko koncepcyjnie)

Podstawy metod asynchronicznych

Metoda async natychmiast zwraca Task<T>; później zadanie zostaje ukończone i zawiera wartość, gdy zakończy się oczekiwana praca.

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

Łączenie operacji await

await pozwala pisać sekwencyjne kroki asynchroniczne w przejrzystym stylu od góry do dołu.

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

Koncepcja maszyny stanów

Koncepcja: Kompilator przekształca metodę asynchroniczną w maszynę stanów.

  • Zmienne lokalne są przechowywane jako pola
  • Każde await prowadzi do nowego stanu
  • Po ukończeniu oczekiwanego obiektu Task metoda jest wznawiana przez kontynuację
  • Wyjątki są przechwytywane i zapisywane w obiekcie Task

Prezentacja TaskCompletionSource

TaskCompletionSource pozwala utworzyć obiekt Task i zasygnalizować jego ukończenie później; await korzysta z niego tak jak z każdego innego obiektu 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);
  }
}

Koncepcja ValueTask

ValueTask (koncepcja): nowszy typ zwracany, który ogranicza alokacje w przypadku wyników często dostępnych synchronicznie.

  • Jest przydatny, gdy wyniki są już dostępne przez większość czasu
  • Obowiązują zasady pozwalające uniknąć dodatkowych alokacji
  • Nie jest dostępny w C# 6 — tutaj należy używać Task; przedstawione idee nadal mają zastosowanie

Asynchroniczna maszyna stanów

Szybkie sprawdzenie: Co kompilator C# generuje dla metody async używającej await?

Podsumowanie

Podsumowanie: Task modeluje pracę; await wstrzymuje i wznawia wykonanie; kompilator tworzy maszynę stanów. ValueTask to koncepcja optymalizacji (w C# 6 należy używać Task).

Bezpłatny start

Ucz się C# dzięki korepetycjom AI — za darmo

Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.

Kursy
93
Lekcje
346

Często zadawane pytania

Czy lekcja „Task/ValueTask i maszyna stanów async (koncepcje)” jest bezpłatna?

Tak — pełny tekst „Task/ValueTask i maszyna stanów async (koncepcje)” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu C# Academy, przejdź na CoddyKit PRO. Kurs C# Academy zawiera 3 lekcji w sumie.

Co nauczysz się w „Task/ValueTask i maszyna stanów async (koncepcje)”?

Proszę zrozumieć wyniki Task i ideę maszyny stanów async. Proszę pisać małe metody asynchroniczne, komponować wyrażenia await oraz poznać ręczne użycie TaskCompletionSource. Ćwiczysz C# Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć C# Academy?

Nie wymagamy żadnego doświadczenia. C# Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 1 z 3.

Ile czasu zajmuje lekcja „Task/ValueTask i maszyna stanów async (koncepcje)”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji C# Academy?

Tak. Każda lekcja C# Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Task/ValueTask i maszyna stanów async (koncepcje)
  2. Pułapki async: sync-over-async i zakleszczenia
  3. ConfigureAwait i przepływ wyjątków
← Powrót do C# Academy