14

我正在使用 ThreadStatic 变量来存储一些数据,但我担心我存储在线程上的数据在我完成并释放回 ThreadPool 后仍然存在。在完成线程之前,我是否需要担心清除我的 ThreadStatic 变量?或者 ThreadPool 会在为下一个 QueueUserWorkItem “传递出去”之前为我做这件事吗?这对我来说尤其重要,因为我需要确保我的应用程序中的其他线程在 ThreadStatic 变量方面具有干净的工作状态。谢谢!

4

2 回答 2

12

线程池(通过设计)使线程在调用之间保持活动状态。这意味着 ThreadStatic 变量将在对 QueueUserWorkItem 的调用之间保持不变。

这种行为也是你不应该指望的。ThreadPool 将(最终,自行决定)释放线程并让它们结束,并根据需要构造新线程。

但是,如果您遇到此问题,我会质疑您的设计。如果您需要在 QueueUserWorkItem 中使用特定的、确定性的 ThreadStatic 数据,您的线程例程可能是您自己进行线程处理的良好候选者。ThreadStatic 和 ThreadPool 并不总是一个很好的组合 - 您不一定有足够的控制权(因为 ThreadPool 管理线程)来真正利用并从 ThreadStatic 变量中受益。你永远不会知道两个工作项是否会在同一个线程上,不同的线程上,以及是否应该(重新)初始化 threadstatic 变量等。

于 2009-05-13T01:05:46.910 回答
6

我希望它们会保留在方法之间。当然,如果有疑问,请在工作方法开始时重置线程静态变量。或使用try/finally清除每个工作单元后的值。

(编辑)

很容易证明它们确实存在。以上快速开始打印大于 0 的数字(如果不同的工作人员被隔离,每次 0 是我们所期望的):

[STAThread]
static void Main()
{
    for (int i = 0; i < 50; i++)
    {
        ThreadPool.QueueUserWorkItem(DoStuff);
    }
    Console.ReadLine();
}
static void DoStuff(object state)
{
    Console.WriteLine(Thread.CurrentThread.ManagedThreadId + ": " + value++);
    Thread.Sleep(20);
}
[ThreadStatic]
static int value;
于 2009-05-12T21:56:08.010 回答