确定性处理ThreadStatic对象
时间:2020-03-06 14:42:59 来源:igfitidea点击:
ThreadStatic属性将静态变量声明为每个线程唯一。
我们知道正确配置此类变量的简单模式吗?
在ThreadStatic之前使用的是ThreadContextManager。每个线程都分配了一个ThreadContext,该Context保留了所有线程特定的信息。我们产生了一些线程并使它们工作。然后,当它们全部完成后,我们处理ThreadContentManager,如果它们是IDisposposable的,则依次处理所有上下文。
我没有看到将这种模式转换为ThreadStatic对象的直接方法。最终这些对象将被丢弃,因为线程死亡,因此没有引用它们的对象。但是,我们更喜欢确定性处置。
更新
我使用Microsoft CCR并不是真正直接控制线程,它具有执行任务的ThreadPool。完成所有任务后,我将部署Dispatcher(用于存放线程池)。关键是我没有机会在"线程的主要功能结束时"做任何事情,因此我无法在线程运行结束时手动进行处理。我可以以某种方式从线程外部访问线程的静态对象吗?
解决方案
我们仍然可以使用ThreadContextManager类的等效项来处理该处置。产生的线程处理此"管理器"对象,该对象又将其了解的所有其他线程静态对象取出。
我更喜欢线程静态对象相对较少,而使用上下文对象。这将线程特定状态仅保留在几个地方,并使这种模式更加容易。
更新:要处理线程池,我们可以创建一个基本的"任务"对象,该对象是传递给线程池的对象。它可以执行代码所需的任何常规初始化,调用"真实"任务,然后执行所需的任何清理。