gpt4 book ai didi

.net - .NET ExecutionContext 如何实际工作?

转载 作者:行者123 更新时间:2023-12-04 11:28:29 27 4
gpt4 key购买 nike

我试图发现 ExecutionContext实际上适用于 .NET Framework 4.0 及更高版本。文档说,在使用 Thread.Start 和大多数线程池操作时,托管原则、同步、区域设置和用户上下文都流向新线程。但我在实践中根本看不到这行得通。

这是一个简单的控制台应用程序,用于测试启动新线程时同步上下文和托管原则是否流动......

    static void Main(string[] args)
{
SynchronizationContext.SetSynchronizationContext(new SynchronizationContext());
Thread.CurrentPrincipal = new GenericPrincipal(new GenericIdentity("One"), null);

Thread t1 = new Thread(new ThreadStart(ThreadRun));
t1.Start();
t1.Join();

SynchronizationContext.SetSynchronizationContext(new SynchronizationContext());
Thread.CurrentPrincipal = new GenericPrincipal(new GenericIdentity("Two"), null);

AsyncFlowControl aFC = ExecutionContext.SuppressFlow();
Thread t2 = new Thread(new ThreadStart(ThreadRun));
t2.Start();
t2.Join();
aFC.Undo();

Console.Read();
}

static void ThreadRun()
{
Console.WriteLine("ThreadRun Id={0} Context={1} Principle={2}",
Thread.CurrentThread.ManagedThreadId,
(SynchronizationContext.Current != null),
Thread.CurrentPrincipal.Identity.Name);
}

结果是……
    ThreadRun Id=11 Context=False Principle=One
ThreadRun Id=12 Context=False Principle=Two

因此,同步上下文永远不会流动,即使您指定它不应流动,托管原则也始终会流动。基本上文档是完全错误的。那么是否有关于 ExecutionContext 在现实中做了什么以及它为什么有用的描述?

最佳答案

这是非常具有误导性的文档。我无法回答你问题的更广泛的主旨,但我可以告诉你为什么 SynchronizationContext不流动。

如果你看Thread.Start的来源,它最终归结为:

    [SecuritySafeCritical]
private void Start(ref StackCrawlMark stackMark)
{
this.StartupSetApartmentStateInternal();
if (this.m_Delegate != null)
((ThreadHelper) this.m_Delegate.Target).SetExecutionContextHelper(ExecutionContext.Capture(ref stackMark, ExecutionContext.CaptureOptions.IgnoreSyncCtx));
this.StartInternal(CallContext.Principal, ref stackMark);
}

请注意,它明确地传递了 ExecutionContext.CaptureOptions.IgnoreSyncCtx默认情况下。它还通过 CallContext.Principal与 ExecutionContext.SuppressFlow() 无关。因此,这解释了为什么您会看到您所看到的内容,但不能解释何时可能有用或为什么文档完全错误!

关于.net - .NET ExecutionContext 如何实际工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9815575/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com