使用ThreadLocal <t>跨不同类传递数据</t>

时间:2014-02-06 17:54:29

标签: c# thread-local-storage

以下有关“另一个主题”的更多信息编辑了我的问题,我们指出我的问题不明确。

如何在不同的类中使用ThreadLocal<T>传递数据?

基本上,我需要将LogContext信息从Webservice中的类传递给TraceExtension:SoapExtension类(TraceExtension用于记录此WebService调用的另一个WebService的请求/响应)。

由于该功能在另一个线程而不是发起请求的线程上运行,我无法从ServiceContext:IExtension <InstanceContext>获取它 ,我通常会用于这样的事情。

我有一个使用Thread.GetNamedDataSlot()方式的工作实现,但在性能测试中,我们发现存在内存泄漏问题。 (是的,我调用了Thread.FreeNamedDataSlot()并且问题仍然存在)。这导致MS发布http://support.microsoft.com/kb/2540745可能存在泄漏问题,但在我们当前的发布时间表中,将无法在所有生产服务器上部署修复程序。建议的解决方法是使用System.Threading.ThreadLocal类。

到目前为止,我找到的所有资源/示例都在同一类和Parallelism和PLinq中都有ThreadLocal的实例。在一个类中初始化/设置数据并从另一个类中检索数据的示例将非常有用。 将数据传递到TraceExtension : SoapExtension的任何其他方式也同样有用。

我们的日程安排有点紧张,非常感谢任何帮助。

使用更多信息进行修改:

请求所在的Webservice的线程创建了一个新的Thread,我们在其上运行一些后台处理,同时返回必要的响应。 新的Thread调用对其他后端Web服务的调用。我们还有一个TraceExtension类来跟踪对后端Web服务的请求/响应。 我们使用ContextInfo : ISynchronizeInvoke将原始Thread中的LogContext信息传递给新线程上的方法。

问题是获取LogContext对象从调用后端webservice调用的类到TraceExtension类(在新线程上运行,而不是在客户端请求具有ServiceContext:IExtension<InstanceContext>的原始线程上运行LogContext)

1 个答案:

答案 0 :(得分:1)

您需要ThreadStaticAttribute