ConfigureAwait (false) поддерживает аутентификацию потока, но по умолчанию это не так - PullRequest
0 голосов
/ 25 ноября 2018

У меня есть простой метод действия Web API, который имеет следующий фрагмент кода

Debug.WriteLine("Before async method call id: " + Thread.CurrentThread.ManagedThreadId);
            Debug.WriteLine("Before async method call auth: " + Thread.CurrentPrincipal.Identity.IsAuthenticated);

            var result = await SomeAsyncMethod();

            Debug.WriteLine("After async method call id: " + Thread.CurrentThread.ManagedThreadId);
            Debug.WriteLine("After async method call auth: " + Thread.CurrentPrincipal.Identity.IsAuthenticated);

Этот код выводит следующее:

Before async method call id: 257
Before async method call auth: True
After async method call id: 268
After async method call auth: False

Обратите внимание, что основной поток теперь не аутентифицирован послежду звонка.Однако, если я использую ConfigureAwait (false), как показано ниже:

Debug.WriteLine("Before async method call id: " + Thread.CurrentThread.ManagedThreadId);
            Debug.WriteLine("Before async method call auth: " + Thread.CurrentPrincipal.Identity.IsAuthenticated);

            var result = await SomeAsyncMethod().ConfigureAwait(false);

            Debug.WriteLine("After async method call id: " + Thread.CurrentThread.ManagedThreadId);
            Debug.WriteLine("After async method call auth: " + Thread.CurrentPrincipal.Identity.IsAuthenticated);

Я вижу вывод ниже:

Before async method call id: 268
Before async method call auth: True
After async method call id: 242
After async method call auth: True

Насколько я понимаю в ConfigureAwait (false), код выполняется в другомпоток без знания контекста исходного потока (аутентификация и т. д.).Следовательно, он наиболее подходит для сторонних библиотек.

Из приведенного выше наблюдения у меня есть следующие вопросы -

  1. Изменение идентификатора потока до и после асинхронного вызова.Разве он не должен возобновляться в главном потоке, вызывающем асинхронный метод?
  2. Даже если вызовы возобновляются в другом потоке (как в примере), он не должен возобновляться с тем же контекстом основного потока (т. Е. IsAuthenticated must)быть правдой)?Почему аутентификация поддерживается с ConfigureAwait (false), а не иначе?

Спасибо!

1 Ответ

0 голосов
/ 26 ноября 2018

Отдельные темы не важны в ASP.NET.Запросы обслуживаются любым доступным потоком из пула потоков.

Важным является контекст синхронизации.

ConfigureAwait(false) дает команду сгенерированному компилятором конечному автомату планировать продолжения в пуле потоков вместоотправка их в захваченный контекст синхронизации, если он был захвачен.

Это контекст синхронизации, который устанавливает поток пула потоков расписания с правильными данными потока и статикой потока.

Вы не должны вызыватьConfigureAwait(false) для методов действия, потому что вы не можете гарантировать, что эти данные потока соответствуют ожидаемым.

Несмотря на наличие контекста синхронизации или нет, асинхронный код передает поток логического контекста через потоки.И с этим течет текущий принципал.

...