【问题标题】:Does .NET ThreadPool thread get reset when it goes back to the pool?.NET ThreadPool 线程返回池时是否会重置?
【发布时间】:2011-10-20 04:06:32
【问题描述】:

当线程池线程完成时,名称或线程本地数据之类的内容是否会被重置? 那么下次线程从池中出来的时候,就像全新的一样?

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

【问题讨论】:

标签: .net multithreading threadpool


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    据我所知没有重置。

    在链接的文档中有提到如何处理的方法。

    【讨论】:

      【解决方案3】:

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

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

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

      这是一件需要非常小心的事情......

      【讨论】:

      • 感谢 msdn 的链接。当然,当我查看 2.0 版本时,缺少信息块。
      • 线程“名称”似乎已被清除。我们的一段代码库通过线程的名称将 DbContext 存储在静态哈希表中,当线程返回池并被重用时,名称为 GONE。
      猜你喜欢
      • 1970-01-01
      • 2023-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-19
      • 1970-01-01
      • 1970-01-01
      • 2010-10-14
      相关资源
      最近更新 更多