首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CallContext.LogicalGetData Vs.CallContext.GetData

CallContext.LogicalGetData Vs.CallContext.GetData
EN

Stack Overflow用户
提问于 2011-05-23 20:38:58
回答 2查看 16.1K关注 0票数 47

MSDN具有LogicalGetDataGetData,但是MSDN文档并没有做太多的工作来解释这两者之间的区别以及它们何时不同。

有什么想法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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

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

票数 17
EN

Stack Overflow用户

发布于 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和各种形式的线程本地存储:

CallContext vs ThreadStatic

How to Pass a variable to another Thread

票数 63
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6097301

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档