Глоссарий¶
- 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).