CallContext.LogicalGetData VS. CallContext.GetData
CallContext
API具有LogicalGetData
& GetData
,但是MSDN文档并不能解释两者之间的区别,以及它们的区别。
有任何想法吗?
看起来,这是与远程调用另一个AppDomain
方法调用相关的细微差别 。 在这种情况下,将创build一个LogicalCallContext
,并以LogicalGetData
访问的方式存储数据。 在正常的非远程方法调用中,数据以GetData
可访问的方式存储。
当对另一个AppDomain中的对象进行远程方法调用时,CallContext类会生成一个随远程调用一起传输的LogicalCallContext实例。 只有公开ILogicalThreadAffinative接口并存储在CallContext中的对象才会在LogicalCallContext的AppDomain之外传播。 不支持此接口的对象不会在具有远程方法调用的LogicalCallContext实例中传输。
GetData
:
从
CallContext
检索具有指定名称的对象。
LogicalGetData
:
从逻辑调用上下文中检索具有指定名称的对象。
通常,通过CallContext.SetData
存储的数据被认为是线程本地的。 也就是说,任何对CallContext.GetData
调用都将从同一个线程获取通过SetData设置的数据。 通过CallContext.LogicalSetData
存储的数据被认为是“逻辑线程”本地的。 也就是说,通过CallContext.LogicalSetData
存储的任何数据将被“stream动”到任何子线程。 如果在同一个线程或任何子线程中调用CallContext.LogicalGetData
,则将获得该线程(或父线程)对CallContext.LogicalSetData
的调用所存储的数据。
由于@sixlettervariables指出,也有一些与Remoting和跨AppDomain调用有关的具体差异(也许跨AppDomain意味着远程处理,我不知道,我不熟悉远程处理一般)。
同样如@sixlettervariables指出的那样,通过在一个对象上实现标记接口ILogicalThreadAffinative,然后使用CallContext.SetData
存储该对象,该对象的行为就好像它已经被CallContext.LogicalSetData
存储一样。
Jeff Richter介绍了如何使用LogicalSetData / LogicalGetData:
下面是从这里的一些更多的链接,这可能会对CallContext.SetData / GetData,CallContext.LogicalSetData / LogicalGetData以及各种forms的线程本地存储产生一些影响:
CallContext与ThreadStatic
如何将variables传递给另一个线程