CallContext.LogicalGetData VS. CallContext.GetData

CallContext API具有LogicalGetDataGetData ,但是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:

http://www.wintellect.com/CS/blogs/jeffreyr/archive/2010/09/27/logical-call-context-flowing-data-across-threads-appdomains-and-processes.aspx

下面是从这里的一些更多的链接,这可能会对CallContext.SetData / GetData,CallContext.LogicalSetData / LogicalGetData以及各种forms的线程本地存储产生一些影响:

CallContext与ThreadStatic

如何将variables传递给另一个线程