Перейти к содержанию

Глоссарий

  • Awaitable («ожидаемое») — выражение, к которому применим await: у него есть метод GetAwaiter() (в том числе методом расширения). Глава 3.
  • Awaiter (по-русски встречаются «ожидатель», «объект ожидания») — то, что возвращает GetAwaiter(): IsCompleted, GetResult(), OnCompleted/UnsafeOnCompleted. Глава 3.
  • Async state machine — сгенерированная структура с методом MoveNext, хранящая состояние метода между await.
  • Builder (async method builder) — тип вроде AsyncTaskMethodBuilder<T>, связывающий машину состояний с возвращаемой задачей: Create, Start, Task, AwaitUnsafeOnCompleted, SetResult, SetException. Название — от паттерна Builder («Строитель»). Глава 3.
  • Бокс машины состояний (state machine box) — объект класса AsyncTaskMethodBuilder<TResult>.AsyncStateMachineBox<TStateMachine> в куче: наследник Task<TResult>, хранит копию машины-структуры (поле StateMachine) и захваченный ExecutionContext. Создаётся при первой реальной приостановке вызова и сам является задачей, которую вернул async-метод. Подробно — глава 1, §1.4.
  • Continuation (продолжение) — код, выполняемый после завершения операции.
  • SynchronizationContext — абстракция «где выполнить продолжение» (UI-поток и др.): поле потока, метод Post ставит делегат в «своё» место. await захватывает его при подписке, если он есть и не базового типа. Глава 5.
  • ConfigureAwait(false) — другой тип awaiter'а (ConfiguredTaskAwaiter), при котором await не захватывает SynchronizationContext и TaskScheduler. Действует на один await, на завершённой задаче поток не меняет. Глава 5, глава 6.
  • Инлайн-продолжение (синхронное продолжение) — продолжение, выполненное прямо внутри вызова, завершившего задачу (SetResult). Запрещается TaskCreationOptions.RunContinuationsAsynchronously. Глава 5.
  • TaskScheduler — планировщик задач (по умолчанию пул потоков).
  • ExecutionContext — неизменяемый снимок данных логического потока выполнения (значения всех AsyncLocal). Захватывается боксом при каждой приостановке, ставится на поток при возобновлении. Глава 7.
  • AsyncLocal<T> — значение, привязанное к ExecutionContext: течёт через await и Task.Run, запись внутри async-метода не видна вызывающему. Глава 7.
  • ExceptionDispatchInfo — исключение вместе с захваченным стеком: его можно перебросить, не затирая исходный стек. В нём Task хранит исключения, await перебрасывает первое. Глава 8.
  • Невыясненное исключение (unobserved) — исключение задачи, которое никто не прочитал до её сборки мусором; приходит событием TaskScheduler.UnobservedTaskException, процесс не роняет. Глава 8.
  • Hoisting (поднятие) — превращение локальной переменной в поле машины состояний.
  • Sync-over-async — блокирующее ожидание асинхронного кода (.Result, .Wait(), .GetAwaiter().GetResult()). При однопоточном контексте — дедлок. Глава 6.
  • Thread pool starvation — нехватка потоков пула из-за блокировок.
  • Backpressure — механизм замедления производителя при перегрузке потребителя.
  • ValueTask — структура-альтернатива Task для частых синхронных завершений: ссылка _obj (null / Task / IValueTaskSource), результат и токен; ждать можно один раз (глава 12).
  • IValueTaskSource<T> — переиспользуемый источник результата для ValueTask; токен (версия) отличает текущую операцию от прошлой. Готовая реализация — ManualResetValueTaskSourceCore<T> (глава 12).
  • Cooperative cancellation — отмена, при которой код сам проверяет токен.
  • Work-stealing — кража работы из чужих локальных очередей потоков пула.
  • Fire-and-forget — запуск Task без ожидания и обработки результата.

  • Кооперативная блокировка (пула потоков) — Task.Wait()/.Result на потоке пула сообщает пулу NotifyThreadBlocked, и тот быстро добавляет потоки; Thread.Sleep так не делает (глава 13).

  • Runtime async — модель, где компилятор помечает метод флагом Async вместо генерации машины состояний, а JIT сохраняет кадр в цепочку Continuation (глава 14).
  • Continuation — объект рантайма с живыми локальными приостановленного runtime-async метода (Next, Resume, Data, GCData).
  • dumpasync — команда dotnet-dump analyze: асинхронные «стеки» по продолжениям задач на куче (глава 15).
  • Поколения GC (gen0/gen1/gen2) — пережив сборку, объект переходит выше; gen2 собирается только полной сборкой. Долго ждущие async-методы оседают в gen2 (глава 21).
  • gcroot — команда dotnet-dump analyze: путь от корня GC (статика, стек, дескриптор) до объекта; показывает, кто не даёт собрать объект (глава 21).