CallContext.LogicalGetData与.CallContext.GetData

ste*_*rnr 44 .net c#

CallContextAPI具有LogicalGetData&GetData,但MSDN文档没有做太多解释两者之间的区别,而当他们有所不同.

有任何想法吗?

wag*_*ghe 57

通常,通过存储的数据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的好博客文章:

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以及各种形式的线程本地存储有所了解:

CallContext与ThreadStatic

如何将变量传递给另一个线程


use*_*116 17

看起来这是与远程方法调用相关的细微差别AppDomain.在这种情况下LogicalCallContext,创建a并以可访问的方式存储数据LogicalGetData.在正常的非远程方法调用中,数据以可访问的方式存储GetData.

当对另一个AppDomain中的对象进行远程方法调用时,CallContext类生成一个与远程调用一起传播的LogicalCallContext实例.只有暴露ILogicalThreadAffinative接口并存储在CallContext中的对象才会在LogicalCallContext中的AppDomain外传播.不支持此接口的对象不会通过远程方法调用在LogicalCallContext实例中传输.

GetData:

从中检索具有指定名称的对象CallContext.

LogicalGetData:

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