代码改变世界

每天学习一点.net(4) 线程池和执行上下文ExectutionContext

2013-06-15 00:08  黑眼圈Mars  阅读(404)  评论(0编辑  收藏  举报

每个线程都关联了一个执行上下文(ExecutionContext)数据结构。执行上下文包括安全设置(压缩栈、Thread的Principal属性和Windows身份)、宿主(System.Threading.HostExecutionContextManager)以及逻辑调用上下文数据(System.Runtime.Messaging.CallContext的LogicalSetData和LogicalGetData方法)

当主线程启动另一个线程时,执行上下文就会由主线程流向辅助线程。可利用ExecutionContext类控制执行上下文的流动。一个典型的

using System;
using System.Threading;
using System.Diagnostics;
public static class program
{
    public static void Main()
    {

        System.Runtime.Remoting.Messaging.CallContext.LogicalSetData("Name", "Jeffery");
       /*此时辅助线程能访问主线程逻辑上下文调用数据*/
        ThreadPool.QueueUserWorkItem(state=>Console.WriteLine("name={0}",System.Runtime.Remoting.Messaging.CallContext.LogicalGetData("Name")));
        /*利用SuppressFlow阻止上下文流动*/


        ExecutionContext.SuppressFlow();

        /*此时辅助线程不能访问主线程逻辑上下文调用数据*/
        ThreadPool.QueueUserWorkItem(state => Console.WriteLine("name={0}", System.Runtime.Remoting.Messaging.CallContext.LogicalGetData("Name")));
       
        /*储存此时的执行上下文*/
        ExecutionContext.RestoreFlow();
        Console.ReadLine();
    }
}