You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 08:55:25