MSDN具有LogicalGetData和GetData,但是MSDN文档并没有做太多的工作来解释这两者之间的区别以及它们何时不同。
有什么想法吗?
发布于 2011-05-23 21:51:21
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
从逻辑调用上下文中检索具有指定名称的对象。
发布于 2011-05-24 02:00:54
通常,通过CallContext.SetData存储的数据被认为是线程本地的。也就是说,对CallContext.GetData的任何调用都将从同一线程获取通过SetData设置的数据。通过CallContext.LogicalSetData存储的数据被认为是“逻辑线程”本地的。也就是说,通过CallContext.LogicalSetData存储的任何数据都将“流”到任何子线程。如果在同一线程或任何子线程中调用CallContext.LogicalGetData,您将获得该线程(或父线程)对CallContext.LogicalSetData的调用所存储的数据。
正如@sixlettervariables所指出的,在远程处理和交叉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和各种形式的线程本地存储:
https://stackoverflow.com/questions/6097301
复制相似问题