2008-09-25 49 views
9

ThreadStatic attribute将静态变量声明为unique-per-thread。 你知道一个简单的模式来正确处理这些变量吗?ThreadStatic对象的确定性处置

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

我没有看到将此模式转换为ThreadStatic对象的直接方式。这些对象将被处置,因为线程死亡,所以没有任何参考。但是,只要有可能,我们都倾向于确定性处置。

更新

我真的不直接控制线程 - 我使用微软CCR,其中有一个线程池,做任务。当所有的任务完成后,我正在处理Dispatcher(包含线程池)。问题是 - 在线程的主函数结束时,我没有机会做任何事情 - 所以我不能在线程运行结束时手动处理事情。我可以以某种方式从线程外部访问线程的静态对象吗?

回答

1

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

我宁愿有相对较少的线程静态对象,而是使用上下文对象。这只会在几个地方保持线程特定的状态,并且使得这种模式更容易。

更新:来处理线程池的情况下,你可以创建一个基础'任务'对象,这是你传递给线程池的对象。它可以执行代码需要的任何通用初始化,调用“真正”的任务,然后执行任何需要的清理。

+0

我不想在每个任务后清理。任何给定的线程在我的线程池中按顺序执行许多任务。它具有上下文的原因是为每个任务节省昂贵的数据结构分配。这意味着我只能在所有线程完成后清理。 – ripper234 2008-09-25 13:30:25