.NET ExecutionContext如何实际工作?

.NET ExecutionContext如何实际工作?,第1张

概述我试图发现 ExecutionContext如何在.NET Framework 4.0及更高版本中实际运行.文档说当使用Thread.Start和大多数线程池 *** 作时,托管原则,同步,区域设置和用户上下文都流向新线程.但我不能在实践中看到这一点. 这是一个简单的控制台应用程序,用于测试启动新线程时同步上下文和托管原则是否流动… static void Main(string[] args) 我试图发现 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.无论ExecutionContext.SuppressFlow()如何,它都会传递CallContext.Principal.所以,解释了为什么你看到你所看到的,但不是什么时候它可能是有用的或为什么文档是错误的!

总结

以上是内存溢出为你收集整理的.NET ExecutionContext如何实际工作?全部内容,希望文章能够帮你解决.NET ExecutionContext如何实际工作?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1206499.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-04
下一篇 2022-06-04

发表评论

登录后才能评论

评论列表(0条)

保存