在 usr 指出我的问题不清楚之后,用下面关于“另一个线程”的更多信息编辑了我的问题。
如何使用ThreadLocal<T>
跨不同类传递数据?
基本上,我需要将 LogContext 信息从 Webservice 中的一个类传递给一个TraceExtension:SoapExtension
类(TraceExtension 是记录此 WebService 调用的另一个 WebService 的请求/响应)。
由于该功能在另一个线程上运行,而不是在发起请求的线程上运行,因此我无法从ServiceContext:IExtension <InstanceContext>
通常用于此类事情的 a 中获取它。
我有一个使用这种Thread.GetNamedDataSlot()
方式的工作实现,但在性能测试中我们发现存在内存泄漏问题。(是的,我已经打电话了Thread.FreeNamedDataSlot()
,问题仍然存在)。这导致 MS 发布http://support.microsoft.com/kb/2540745可能存在泄漏问题,但在我们当前的发布时间范围内,不可能在所有生产服务器上部署修复程序。建议的解决方法是使用 System.Threading.ThreadLocal 类。
到目前为止,我发现的所有资源/示例都有同一类中的 ThreadLocal 实例以及 Parallelism 和 PLinq 实例。在一个类中初始化/设置数据并从另一个类中检索数据的示例将非常有帮助。将数据传递给的任何其他方式TraceExtension : SoapExtension
也同样有帮助。
我们的日程安排有点紧,我们将不胜感激。
编辑更多信息:
发出请求的 Web 服务线程创建了一个新线程,我们在该线程上运行一些后台处理,同时返回必要的响应。新线程调用对其他后端 Web 服务的调用。我们还有一个 TraceExtension 类来跟踪后端 Web 服务的请求/响应。我们使用ContextInfo : ISynchronizeInvoke
.
问题是从调用后端 web 服务调用的类中获取 LogContext 对象到 TraceExtension 类(它在新线程上运行,而不是在客户端请求所在的原始线程上运行,ServiceContext:IExtension<InstanceContext>
它确实保存了 LogContext)