Назад к началу Мы отвлеклись от обсуждения ExecutionContext, когда я писал о реализации AsyncTaskMethodBuilder.Start, которая, как я сказал, фактически была: а затем предложил немного упростить. Это упрощение игнорировало тот факт, что метод на самом деле должен учитывать ExecutionContext, и поэтому он больше похож на это: Вместо того, чтобы просто вызывать stateMachine.MoveNext(), как я предлагал ранее, мы начинает здесь танцевать: получаем текущий контекст ExecutionContext, затем вызываем его MoveNext, а затем, по его завершению, возвращаем текущий контекст к тому, что было до MoveNext вызова. Причина этого заключается в предотвращении утечки внешних данных из асинхронного метода в вызывающую сторону. Пример метода демонстрирует, почему это важно: «Олицетворение» — это изменение внешней информации о текущем пользователе, чтобы она принадлежала кому-то другому; это позволяет коду действовать от имени другого человека, используя его привилегии и доступ. В .NET такое олицетворение распр