CallContext.LogicalGetData Vs. CallContext.GetData
本文关键字:CallContext GetData LogicalGetData Vs | 更新日期: 2023-09-27 17:57:30
CallContext
API具有LogicalGetData
&GetData
,但MSDN文档并没有解释两者之间的区别,以及它们何时不同。
有什么想法吗?
通常,通过CallContext.SetData
存储的数据被认为是线程本地的。也就是说,对CallContext.GetData
的任何调用都将从同一线程获得通过SetData设置的数据。通过CallContext.LogicalSetData
存储的数据被认为是本地的"逻辑线程"。也就是说,通过CallContext.LogicalSetData
存储的任何数据都将"流动"到任何子线程。如果在同一线程或任何子线程中调用CallContext.LogicalGetData
,则将获得该线程(或父线程)对CallContext.LogicalSetData
的调用所存储的数据。
正如@sixlettervariables所指出的,远程处理和跨AppDomain调用也有一些特定的差异(也许跨AppDomain意味着远程处理,我不知道,我对远程处理一般不太熟悉)。
同样正如@sixlettervariables所指出的,通过在对象上实现标记接口ILogicalThreadAffinnative,然后使用CallContext.SetData
存储该对象,该对象的行为基本上就像它是由CallContext.LogicalSetData
存储的一样。
以下是JeffRichter关于使用LogicalSetData/LogicalGetData:的一篇很好的博客文章
http://www.wintellect.com/CS/blogs/jeffreyr/archive/2010/09/27/logical-call-context-flowing-data-across-threads-appdomains-and-processes.aspx
以下是SO上的更多链接,可能会对CallContext.SetData/GetData、CallContext.LogicalSetData/LogicalGetData和各种形式的线程本地存储有所了解:
调用上下文与线程静态
如何将变量传递给另一个线程
这似乎是一个细微的差异,与远程调用另一个AppDomain
的方法有关。在这种情况下,创建LogicalCallContext
并且以LogicalGetData
可访问的方式存储数据。在正常的非远程方法调用中,数据以GetData
可访问的方式存储。
当对另一个AppDomain中的对象进行远程方法调用时,CallContext类会生成一个LogicalCallContext实例,该实例与远程调用一起运行。只有公开ILogicalThreadAssociate接口并存储在CallContext中的对象才会在LogicalCallContext中传播到AppDomain之外。不支持此接口的对象不会在具有远程方法调用的LogicalCallContext实例中传输。
GetData
:
从
CallContext
中检索具有指定名称的对象。
LogicalGetData
:
从逻辑调用上下文中检索具有指定名称的对象。