Найти тему
using Dev

Как на самом деле работает Async/Await в C# ч.8

Назад к началу

Мы отвлеклись от обсуждения ExecutionContext, когда я писал о реализации AsyncTaskMethodBuilder.Start, которая, как я сказал, фактически была:

-2

а затем предложил немного упростить. Это упрощение игнорировало тот факт, что метод на самом деле должен учитывать ExecutionContext, и поэтому он больше похож на это:

-3

Вместо того, чтобы просто вызывать stateMachine.MoveNext(), как я предлагал ранее, мы начинает здесь танцевать: получаем текущий контекст ExecutionContext, затем вызываем его MoveNext, а затем, по его завершению, возвращаем текущий контекст к тому, что было до MoveNext вызова.

Причина этого заключается в предотвращении утечки внешних данных из асинхронного метода в вызывающую сторону. Пример метода демонстрирует, почему это важно:

-4

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

-5

Этот код может обнаружить, что изменения в ExecutionContext, сделанные внутри ElevateAsAdminAndRunAsync, сохраняются после возврата ElevateAsAdminAndRunAsync к своему синхронному вызывающему методу (что происходит в первый раз, когда метод ожидает завершения задачи, которая еще не завершена). Это связано с тем, что после вызова Impersonate мы вызываем DoSensitiveWorkAsync и ожидаем завершения возвращаемой задачи. Предполагая, что задача не завершена, это вызовет возврат вызова ElevateAsAdminAndRunAsync к вызывающему методу, при этом имперсонация все еще будет действовать на текущем потоке. Это не то, что мы хотим. В связи с этим Start устанавливает эту защиту, которая гарантирует, что любые изменения в ExecutionContext не вытекут из синхронного вызова метода и будут передаваться только вместе с последующей работой, выполняемой методом.

Источник

to be continued...