为何Thread.CurrentPrincipal在async await后持久化行为与预期相反?
Thread.CurrentPrincipal与ASP.NET同步上下文的关联问题
public async Task Get() { // 使用.ConfigureAwait(false): "AspNetSynchronizationContext" // 不使用.ConfigureAwait(false): "AspNetSynchronizationContext" var synchContext = SynchronizationContext.Current.GetType().Name; // 使用.ConfigureAwait(false): "david.klempfner@email.com" // 不使用.ConfigureAwait(false): "david.klempfner@email.com" var originalName = Thread.CurrentPrincipal.Identity.Name; Thread.CurrentPrincipal = new CustomPrincipal("A"); // 使用.ConfigureAwait(false): "A" // 不使用.ConfigureAwait(false): "A" var name = Thread.CurrentPrincipal.Identity.Name; await Task.Delay(1000).ConfigureAwait(false); //await Task.Delay(1000); // 使用.ConfigureAwait(false): null // 不使用.ConfigureAwait(false): "AspNetSynchronizationContext" var newSynchContext = SynchronizationContext.Current?.GetType().Name; // 使用.ConfigureAwait(false): "A" // 不使用.ConfigureAwait(false): "david.klempfner@email.com" var newName = Thread.CurrentPrincipal.Identity.Name; }
我在设置Thread.CurrentPrincipal = new CustomPrincipal("A")后发现一个奇怪的现象:
- 当调用
await Task.Delay(1000).ConfigureAwait(false)时,Thread.CurrentPrincipal的值能保持为"A"; - 但调用
await Task.Delay(1000)(不带ConfigureAwait(false))时,这个值会恢复成原始的"david.klempfner@email.com"。
这和我看到的资料描述相反,资料说ASP.NET是通过SynchronizationContext来设置Thread.CurrentPrincipal的。我原本以为,使用ConfigureAwait(false)不会回到原上下文,而原上下文应该包含原始的Thread.CurrentPrincipal——但实际结果正好反过来。
想请教:Thread.CurrentPrincipal是否和同步上下文关联?如果关联的话,为什么回到原上下文后,我设置的新值没有被保留,反而恢复成了原始值?
更新:
我的项目配置如下:
- web.config中配置:
<httpRuntime targetFramework="4.5" requestValidationMode="4.5" enableVersionHeader="false" />和<compilation targetFramework="4.5.2" debug="true" /> - .csproj中设置:
<TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
内容的提问来源于stack exchange,提问作者David Klempfner
相关产品推荐
相关产品推荐

