continuation
- делегат, который выполняется, когда ожидаемая вещь завершается.Обычно ожидаемый TaskAwaiter
хранит continuation
в поле и запускает его после завершения Task
.
Конечный автомат, сгенерированный компилятором, использует это для перехода к следующему состоянию, котороев свою очередь вызовет .GetResult()
для ожидаемой вещи (как для получения результата, так и для выдачи любых исключений);
Так что continuation
- это делегат, который в конечном итоге вызывает GetResult()
.
Вы можете найти, где OnCompleted
называется , здесь .continuation
является результатом AsyncMethodBuilderCore.GetCompletionAction
, который создает его из MoveNextRunner.Run
, который вызывает MoveNext
на конечном компьютере .
Если вы посмотрите код, генерируемый компилятором для вашего асинхронного метода , вы увидите, что MoveNext
вызывает awaiter.GetResult()
.
Чтобы увидеть, как Task
работает здесь, начните с TaskAwaiter.OnCompleted
и увидите, что он вызывает Task.SetContinuationForAwait
, что вызывает AddTaskContinuation
, что в итоге сохраняет его вm_continuationObject
.Затем вызывается в Task.FinishContinuations
.