【发布时间】:2019-04-27 04:14:48
【问题描述】:
我有一个简单的 Web API 操作方法,其中包含以下代码 sn-p
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
请注意,在 await 调用之后,主线程现在是未经身份验证的。但是,如果我像下面这样使用 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) 的理解是代码在不同的线程中运行 不知道原始线程的上下文(身份验证等)。因此,它最适合第三方库。
根据以上观察,我有以下问题-
- 异步调用前后线程 ID 的变化。不应该在调用异步方法的主线程上恢复吗?
- 即使调用在不同的线程上恢复(如示例中所示),它是否应该在主线程的相同上下文中恢复(即 IsAuthenticated 必须为真)?为什么使用 ConfigureAwait(false) 验证保持 true 而不是其他情况?
谢谢!
【问题讨论】:
标签: c# asp.net multithreading asp.net-web-api async-await