2011-08-04 30 views
12

当一个线程池线程完成后,像名称或线程本地数据得到重置的东西吗? 所以当下一次线程从池中出来时,它就像全新的?.NET ThreadPool线程在返回到池时会被重置吗?

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

+1

[使用带有ThreadStatic属性的并行扩展的可能的重复。可以泄漏内存?](http://stackoverflow.com/questions/3029449/using-parallel-extensions-with-threadstatic-attribute-could-it-leak-memory) –

回答

8

它在释放时不会清除线程本地存储,这是最重要的方面。

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

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

这是值得非常小心......

+0

感谢您的链接到msdn。当然,当我看到信息块丢失的2.0版本。 –

3

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

现实世界的比喻将是你每天上班的公共汽车。让我们说出于某种原因,你想把你的包放在公共汽车上,因为你知道它不会被盗。这是一个坏主意,因为下次你上车时你可能找不到你的包。只是因为它可能是一辆不同的巴士。公共汽车站可能会在公交线路之间旋转公交车,或者可能会处理旧公交车。就像线程池可能会重用或退出线程而不让你知道。

相关问题