您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

.NET ExecutionContext如何实际工作?

5b51 2022/1/14 8:22:08 python 字数 2863 阅读 494 来源 www.jb51.cc/python

我试图发现 ExecutionContext如何在.NET Framework 4.0及更高版本中实际运行.文档说当使用Thread.Start和大多数线程池操作时,托管原则,同步,区域设置和用户上下文都流向新线程.但我不能在实践中看到这一点. 这是一个简单的控制台应用程序,用于测试启动新线程时同步上下文和托管原则是否流动… static void Main(string[] args)

概述

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

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在现实中的作用以及它为何有用?

如果你看一下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如何实际工作?所遇到的程序开发问题。


如果您也喜欢它,动动您的小指点个赞吧

除非注明,文章均由 laddyq.com 整理发布,欢迎转载。

转载请注明:
链接:http://laddyq.com
来源:laddyq.com
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


联系我
置顶