.NET ThreadPool线程在返回池时是否会重置?

时间:2011-08-04 16:19:09

标签: .net multithreading threadpool

当线程池线程完成时,Name或线程本地数据之类的东西会被重置吗? 那么当线程下次从池中出来时,它就像全新的一样?

是否有关于ThreadPool线程这方面的“官方”文档?

3 个答案:

答案 0 :(得分:9)

它在发布时不会清除线程本地存储,这是最重要的注意事项。

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

  

当线程池重用线程时,它不会清除数据   线程本地存储或用标记的字段   ThreadStaticAttribute属性。因此,放入的数据   一个方法的线程本地存储可以暴露给任何其他方法   由同一个线程池线程执行。一种方法   访问用ThreadStaticAttribute标记的字段   属性可以根据哪个线程遇到不同的数据   池线程执行它。

这是非常谨慎的事情......

答案 1 :(得分:3)

答案是否定的,它不会被重置。但是,您不应该依赖这个事实,因为无论您的下一个工作项是在新线程上还是在重用线程上执行,都取决于线程池。因此,您可能会或可能不会再次看到Thread Thread Storage。因此,我不建议在线程池上使用线程本地存储。线程池实现是一个内部细节,可以更改。

现实世界的比喻将是你每天上班的公共汽车。让我们说,出于某种原因,你想把你的包放在公共汽车上,因为你知道它不会被盗。这是个坏主意,因为下次上车时你可能找不到行李。仅仅因为它可以是一个不同的总线。公交车站可以在线路之间轮换公交车,也可以配置较旧的公交车。就像线程池可以重用或退出线程而不让你知道。

答案 2 :(得分:2)

这是a very good read on parallel programming and TPL in .NET (4)

据我所知,没有重置。

在链接文档中,有一些方法可以解决这个问题。