【发布时间】:2011-08-31 03:17:23
【问题描述】:
CallContext API 有 LogicalGetData 和 GetData,但 MSDN 文档并没有解释两者之间的区别以及它们何时不同。
有什么想法吗?
【问题讨论】:
CallContext API 有 LogicalGetData 和 GetData,但 MSDN 文档并没有解释两者之间的区别以及它们何时不同。
有什么想法吗?
【问题讨论】:
通常,通过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 以及各种形式的线程本地存储:
【讨论】:
Logical[Set|Get]Data 用于非@987654334 @实施者?
It appears that this is a subtle difference related to method calls made remotely to another AppDomain。在这种情况下,会创建一个LogicalCallContext,并以LogicalGetData 可访问的方式存储数据。在正常的非远程方法调用中,数据以GetData 可访问的方式存储。
当对另一个 AppDomain 中的对象进行远程方法调用时,CallContext 类会生成一个与远程调用一起传播的 LogicalCallContext 实例。只有公开 ILogicalThreadAffinative 接口并存储在 CallContext 中的对象才会在 LogicalCallContext 中的 AppDomain 之外传播。不支持此接口的对象不会在具有远程方法调用的 LogicalCallContext 实例中传输。
GetData:
从
CallContext中检索具有指定名称的对象。
LogicalGetData:
从逻辑调用上下文中检索具有指定名称的对象。
【讨论】: