【发布时间】:2011-10-20 04:06:32
【问题描述】:
当线程池线程完成时,名称或线程本地数据之类的内容是否会被重置? 那么下次线程从池中出来的时候,就像全新的一样?
是否有关于 ThreadPool 线程这方面的“官方”文档?
【问题讨论】:
标签: .net multithreading threadpool
当线程池线程完成时,名称或线程本地数据之类的内容是否会被重置? 那么下次线程从池中出来的时候,就像全新的一样?
是否有关于 ThreadPool 线程这方面的“官方”文档?
【问题讨论】:
标签: .net multithreading threadpool
答案是否定的,它不会被重置。但是,您不应该依赖这个事实,因为您的下一个工作项是在新线程上执行还是在重用线程上执行取决于线程池。因此,您可能会或可能不会再次看到您的 Thread Local Storage。出于这个原因,我不建议在线程池上使用线程本地存储。线程池实现是一个内部细节,可能会发生变化。
现实世界的比喻是你每天上班的公共汽车。可以说,出于某种原因,您想将包留在公共汽车上,因为您知道它不会被盗。这是一个坏主意,因为下次您上车时可能找不到您的包。仅仅因为它可以是不同的总线。公共汽车站可能会在线路之间轮换公共汽车,也可能会处置较旧的公共汽车。就像线程池可能会在不通知您的情况下重用或停用线程。
【讨论】:
【讨论】:
它在释放时不会清除线程本地存储,这是最需要注意的方面。
http://msdn.microsoft.com/en-us/library/system.threading.threadpool.aspx
线程池重用线程时,不会清除里面的数据 线程本地存储或在标有 ThreadStaticAttribute 属性。因此,放置在 一种方法的线程本地存储可以暴露给任何其他方法 由同一个线程池线程执行。一种方法 访问标有 ThreadStaticAttribute 的字段 属性可能会遇到不同的数据,具体取决于哪个线程 池线程执行它。
这是一件需要非常小心的事情......
【讨论】: