У меня есть простой метод действия 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), код выполняется в другомпоток без знания контекста исходного потока (аутентификация и т. д.).Следовательно, он наиболее подходит для сторонних библиотек.
Из приведенного выше наблюдения у меня есть следующие вопросы -
- Изменение идентификатора потока до и после асинхронного вызова.Разве он не должен возобновляться в главном потоке, вызывающем асинхронный метод?
- Даже если вызовы возобновляются в другом потоке (как в примере), он не должен возобновляться с тем же контекстом основного потока (т. Е. IsAuthenticated must)быть правдой)?Почему аутентификация поддерживается с ConfigureAwait (false), а не иначе?
Спасибо!