.NET 线程,线程执行上下文

本文介绍了.NET中线程的组成,包括线程内核对象、线程环境块、用户模式栈和内核模式栈。同时,深入讨论了线程执行上下文,包括其包含的安全设置、宿主设置和逻辑调用上下文数据。执行上下文的流动会影响性能,阻止上下文流动在某些情况下可以提升性能,但需确保新线程不依赖原始上下文。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

NET目前的每一个线程对应的是windows系统的物理线程,每个线程都会包含一下一些要素:

1.线程内核对象(Thread kernel object),OS为系统中每一个线程分配初始化的数据结构,包含线程上下文Thread Context(一个内存区域包含CPU寄存器集合);

2.线程环境块(Thread Environment block),包含了线程的异常处理链首,线程每次进入try块,都会在链首插入一个节点,退出try块时,会从链中删除节点。还包含了一些其他的数据;

3.用户模式栈(user-mode stack),包含传给方法的局部变量和实参,以及方法的返回地址;

4.内核模式栈(kernel-mode stack),运用程序调用内核模式函数时,会使用内核模式栈,主要是处于安全的原因考虑,用户模式的代码传给内核模式的代码,会被从用户模式栈拷贝到内核模式栈中。


线程执行上下文(Execute context):每一个线程都关联了一个执行上下文数据结构。包括的东西有安全设置(压缩栈,Thread的principle属性和windows的身份 ),宿主设置以(System.Threading.HostExecutionContextManager)及逻辑调用上下文数据(System.Runtime.Remoting.Messaging.ExecutionContext)。线程执行代码的时候,有些操作会受到线程执行上下文的限制,例如安全设置的影响。理想情况下,在一个线程中调用另外一个线程,想成上下文应该流动(复制)到另外一个线程中,确保两个线程有相同的执行上下文。执行上下文的流动是需要消耗性能的。System.Threading空间中有一个ExcecuteContext类可以执行上下文如何留下另外一个线程。阻止上下文流动可以提升一定的性能,前提是需要保证,新线程不应该依赖于调用ExcecuteContext控制执行上下文流动线程的执行上下文。

        static void Main(string[] args)
        {
            CallContext.LogicalSetData("jedi", 23);
            ExecutionContext.SuppressFlow();
            ThreadPool.QueueUserWorkItem(CallBack);

            ExecutionContext.RestoreFlow();
            ThreadPool.QueueUserWorkItem(CallBack);

            Console.ReadLine();
        }
        static void CallBack(object state)
        {
            Console.WriteLine("上下文结果:"+CallContext.LogicalGetData("jedi"));
        }

执行结果是

上下文结果:
上下文结果:23


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值