0Pricing
C# Academy · Урок

Task/ValueTask и асинхронная машина состояний (концепции)

Разберитесь в результатах Task и идее асинхронной машины состояний. Пишите небольшие асинхронные методы, объединяйте await и изучите ручное использование TaskCompletionSource.

«Task/ValueTask и асинхронная машина состояний (концепции)» — бесплатный урок C# Academy на CoddyKit. Это урок 1 из 3. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C# Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C# Academy содержит 3 уроков всего.

Ментальная модель

Цель: сформировать интуитивное понимание асинхронности.

  • Task представляет выполняемую работу и будущий результат
  • await приостанавливает выполнение, а затем возобновляет его
  • Компилятор создаёт конечный автомат
  • ValueTask: более новая оптимизация (здесь рассматривается только концепция)

Основы асинхронного метода

Метод async сразу возвращает Task<T>; позднее он завершается значением, когда ожидаемая работа заканчивается.

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

Оператор await позволяет записывать последовательные асинхронные шаги в понятном стиле — сверху вниз.

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

Идея конечного автомата

Концепция: компилятор преобразует асинхронный метод в конечный автомат.

  • Локальные переменные сохраняются в полях
  • Каждый await переводит выполнение в новое состояние
  • Когда ожидаемый Task завершается, продолжение возобновляет метод
  • Исключения перехватываются и устанавливаются (set) в Task

Демонстрация TaskCompletionSource

TaskCompletionSource позволяет создать Task и сообщить о его завершении позднее; await использует его так же, как любой другой 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

ValueTask (концепция): более новый тип возвращаемого значения, позволяющий экономить выделения памяти при часто синхронно завершающихся операциях.

  • Полезен, когда результаты большую часть времени уже доступны
  • Имеет правила, предотвращающие лишние выделения памяти
  • Недоступен в C# 6 — здесь используйте Task; сами идеи остаются применимыми

Асинхронный конечный автомат

Быстрая проверка: что создаёт компилятор C# для асинхронного метода, использующего await?

Повторение

Повторение: Task моделирует работу; await приостанавливает и возобновляет выполнение; компилятор создаёт конечный автомат. ValueTask — это концепция оптимизации (в C# 6 используйте Task).

Часто задаваемые вопросы

Урок «Task/ValueTask и асинхронная машина состояний (концепции)» бесплатный?

Да — полный текст урока «Task/ValueTask и асинхронная машина состояний (концепции)» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C# Academy, подпишись на CoddyKit PRO. Курс C# Academy содержит 3 уроков всего.

Чему я научусь в уроке «Task/ValueTask и асинхронная машина состояний (концепции)»?

Разберитесь в результатах Task и идее асинхронной машины состояний. Пишите небольшие асинхронные методы, объединяйте await и изучите ручное использование TaskCompletionSource. Ты практикуешь C# Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать C# Academy?

Предыдущий опыт не требуется. C# Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 3.

Сколько времени занимает урок «Task/ValueTask и асинхронная машина состояний (концепции)»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке C# Academy?

Да. Каждый урок C# Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Task/ValueTask и асинхронная машина состояний (концепции)
  2. Подводные камни асинхронности: синхронный вызов асинхронного кода и взаимные блокировки
  3. ConfigureAwait и распространение исключений
← Назад к C# Academy