CallContext在多线程传递试验分析

ExpandedBlockStart.gif 代码
using  System;
using  System.Collections.Generic;
using  System.Linq;
using  System.Text;
using  System.Runtime.Remoting.Messaging;
using  System.Threading;
namespace  ConsoleApplication2
{
    
class  Program
    {
        
static   void  Main( string [] args)
        {
            CallContext.SetData(
" p1 " new  Person1 { Name  =   " xhan " });
            CallContext.SetData(
" p2 " new  Person2 { Name  =   " xhan "  });


            CallContext.LogicalSetData(
" name " 36 );
            Action action 
=  PrintPerson;

            action.BeginInvoke(
null null );

            PrintPerson();

            Console.Read();
        }
        
public   static   void  PrintPerson()
        {
            Console.WriteLine(
" logicalData: "   +  CallContext.LogicalGetData( " name " ));
            Person1 p1 
=  CallContext.GetData( " p1 " as  Person1;
            Person2 p2 
=  CallContext.GetData( " p2 " as  Person2;
            
if  (p1  !=   null )
            {
                Console.WriteLine(
" thread Id: "   +  Thread.CurrentThread.ManagedThreadId  +   "  p1.Name: "   +  p1.Name);

            }
            
else
            {
                Console.WriteLine(
" thread Id: "   +  Thread.CurrentThread.ManagedThreadId  +   "  p1.Name:null " );
            }
            
if  (p2  !=   null )
            {
                Console.WriteLine(
" thread Id: "   +  Thread.CurrentThread.ManagedThreadId  +   "  p2.Name: "   +  p2.Name);
            }
            
else
            {
                Console.WriteLine(
" thread Id: "   +  Thread.CurrentThread.ManagedThreadId  +   "  p2.Name:null " );
            }
        }


    }
    
public   class  Person1 
    {
        
public   string  Name {  get set ; }
    }
    
public   class  Person2 : ILogicalThreadAffinative 
    {
        
public   string  Name {  get set ; }
    }
}

CallContext一般来说是绑定到特定线程的一个上下文数据存储,我们可以通过CallContext的静态方法GetData, SetData, and FreeNamedDataSlot,来管理线程内上下文数据。但是有些时候,我们需要将一个线程的上下文传递到另一个线程中。比如异步调用一个方法,或者显示创建新的线程。上面的例子说明了通过SetData方法设置的数据对象是不会自动传播上下文到新的线程中。如果要想传递上下文中的对象到新线程。通过SetData放到数据槽中的对象必须实行ILogicalThreadAffinative这个标记接口.另一个方法是通过LogicalSetData和LogicalGetData来放置上下文数据,这种方式放置的对象都会自动传递到新线程中.

 

另外asp.net中的HttpContext.Current对象也是基于CallContext实现的,而且asp.net中HttpConext.Current不能自动的跨线程传递。http://www.cnblogs.com/whtydn/archive/2009/07/16/1524580.html

 

 

参考:http://www.cnblogs.com/vwxyzh/archive/2009/02/21/1395416.html

http://www.pin5i.com/showtopic-27165-2.html

 

转载于:https://www.cnblogs.com/xhan/archive/2010/07/09/1774052.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值