是否在后台工作者调用之间保留了线程本地存储?

时间:2009-02-18 15:29:56

标签: c# .net multithreading backgroundworker thread-local

是否重复使用了后台工作线程?

具体来说,如果我在后台工作者的DoWork()方法中设置了一个命名数据槽(线程局部存储),那么该数据槽的值是否会持续存在,以后可能会找到其他某个线程?

我不会这么想,但我有这个错误......

编辑:This blog post表示BackGroundWorker使用ThreadPool,这意味着 重新使用了。所以问题就变成了;重用线程是否可能在调用之间持久保存线程本地存储?

2 个答案:

答案 0 :(得分:8)

当线程池重用线程时,它不会清除线程本地存储中或使用ThreadStaticAttribute属性标记的字段中的数据。因此,通过一个方法放置在线程本地存储中的数据可以暴露给由同一线程池线程执行的任何其他方法。访问使用ThreadStaticAttribute属性标记的字段的方法可能会遇到不同的数据,具体取决于哪个线程池线程执行它。

  

来源:   http://msdn.microsoft.com/en-us/library/system.threading.threadpool.aspx

答案 1 :(得分:-1)

如果未在MSDN中指定,则需要检查源(或通过Reflector)以确定它。

如果未指定,则不能依赖当前行为,而不会在将来的.NET版本中进行更改。

编辑:看起来它正在使用线程池,因此线程重用。