该CallContext
API具有LogicalGetData
&GetData
,但MSDN文档没有做太多解释两者之间的区别,而当他们有所不同.
有任何想法吗?
wag*_*ghe 57
通常,通过存储的数据CallContext.SetData
被认为是线程本地的.也就是说,任何调用CallContext.GetData
都将从同一个线程获取通过SetData设置的数据.存储的数据CallContext.LogicalSetData
被认为是本地的"逻辑线程".也就是说,任何存储的数据CallContext.LogicalSetData
都将"流"到任何子线程.如果您调用CallContext.LogicalGetData
同一个线程或任何子线程,您将获得该线程(或父线程)调用所存储的数据CallContext.LogicalSetData
.
正如@sixlettervariables指出的那样,还有一些与Remoting和跨AppDomain调用有关的特定差异(可能跨AppDomain意味着Remoting,我不知道,我对Remoting一般不熟悉).
同样正如@sixlettervariables指出的那样,通过在对象上实现标记接口ILogicalThreadAffinative然后使用CallContext.SetData
该对象存储该对象,该对象的行为基本上就像它已被存储一样CallContext.LogicalSetData
.
以下是Jeff Richter关于使用LogicalSetData/LogicalGetData的好博客文章:
这里有一些关于SO的更多链接,可能会对CallContext.SetData/GetData,CallContext.LogicalSetData/LogicalGetData以及各种形式的线程本地存储有所了解:
use*_*116 17
看起来这是与远程方法调用相关的细微差别AppDomain
.在这种情况下LogicalCallContext
,创建a并以可访问的方式存储数据LogicalGetData
.在正常的非远程方法调用中,数据以可访问的方式存储GetData
.
当对另一个AppDomain中的对象进行远程方法调用时,CallContext类生成一个与远程调用一起传播的LogicalCallContext实例.只有暴露ILogicalThreadAffinative接口并存储在CallContext中的对象才会在LogicalCallContext中的AppDomain外传播.不支持此接口的对象不会通过远程方法调用在LogicalCallContext实例中传输.
GetData
:
从中检索具有指定名称的对象
CallContext
.
LogicalGetData
:
从逻辑调用上下文中检索具有指定名称的对象.