CallContext.LogicalGetData Vs. CallContext.GetData

本文关键字:CallContext GetData LogicalGetData Vs | 更新日期: 2023-09-27 17:57:30

CallContext API具有LogicalGetData&GetData,但MSDN文档并没有解释两者之间的区别,以及它们何时不同。

有什么想法吗?

CallContext.LogicalGetData Vs. CallContext.GetData

通常,通过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:

从逻辑调用上下文中检索具有指定名称的对象。