确定性地处理ThreadStatic对象

时间:2008-09-25 11:55:11

标签: c# .net multithreading dispose thread-static

ThreadStatic attribute将静态变量声明为每个线程唯一。 你知道一个简单的模式来正确处理这些变量吗?

我们在ThreadStatic之前使用的是ThreadContextManager。每个线程都分配了一个ThreadContext,它保留了所有特定于线程的信息。我们产生了一些线程并让它们工作。然后,当它们全部完成时,我们处理了ThreadContentManager,如果它们是IDisposable,它们会处理所有上下文。

我没有看到将此模式转换为ThreadStatic对象的直接方法。最终将丢弃对象,因为线程会死亡,因此没有任何引用它们。但是,我们更倾向于确定性处置。

更新

我并不直接控制线程 - 我正在使用Microsoft CCR,它有一个执行任务的ThreadPool。当所有任务完成后,我正在处理Dispatcher(它拥有线程池)。问题是 - 我没有机会在线程的主要功能结束时做任何事情“ - 所以我不能在线程运行结束时手动处理事情。我能以某种方式从线程外部访问线程的静态对象吗?

1 个答案:

答案 0 :(得分:1)

您仍然可以使用等效的ThreadContextManager类来处理dispose。产生的线程处理这个'manager'对象,该对象反过来取出它知道的所有其他线程静态对象。

我更喜欢拥有相对较少的线程静态对象,而是使用上下文对象。这使线程特定状态只保留在几个地方,并使这样的模式更容易。

更新:以处理线程池情况,您可以创建一个基本的“任务”对象,该对象是您传递给线程池的对象。它可以执行代码所需的任何通用初始化,调用“真实”任务,然后执行所需的任何清理。