如何在收集拥有对象时终止工作线程?

时间:2011-06-16 06:01:47

标签: c# multithreading garbage-collection finalizer

我有一个具有BackgroundWorker线程的对象(纯粹是一个Action委托队列)。也就是说,这是普通的,简单的单一生产者单一消费者情景。

当收集单个生成器时,我希望它将Terminate操作排入BackgroundWorker线程。

这听起来很简单 - 使用终结器 - 但这会破坏“不要触摸终结器中的托管资源”规则。

那么一旦没有更多的工作要做,我如何确保线程干净地终止?

答案我宁愿不接受:

  • IDisposable:这需要对基类进行大规模的更改,但我接受它可能是必需的(这似乎是IDisposable模式的一个问题..)
  • ThreadPool:这些是长时间运行的操作,必须按顺序运行。所以我认为专用线程是合乎逻辑的选择。
  • WeakReference:我刚才想到了这个。也许这是正确的方法(?)。基本上,线程将WeakReference保留回拥有对象,并定期唤醒自己以检查WeakReference是否仍然存活,当它死亡时它将终止队列。不完全优雅 - 我不喜欢“定期唤醒自己”位 - 但这是最​​好的解决方案吗?

1 个答案:

答案 0 :(得分:2)

IDisposable或类似的东西听起来像是对我来说最好的方法 - 明确说明你何时完成制作,而不是从垃圾收集中触发。

从根本上说,问题不是终止工作线程 - 它表明你已经完成了生产。我确实理解在某些情况下这可能会很棘手,但是如果在所有可能的情况下它会让你的生活更加可预测,如果你能明确地做到这一点。