2011-06-16 64 views
2

我有一个对象具有BackgroundWorker线程(纯粹是一个Action委托队列)。即它是普通的,简单的单生产者单消费者场景。如何在收集拥有对象时终止工作线程?

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

它几乎听起来很简单 - 使用终结器 - 但打破了“不要触摸终结器中的托管资源”规则。

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

回答我宁愿不拍:

  • IDisposable:这需要一个庞大的重大更改基类,但我接受它也许需要(这似乎总是与IDisposable的问题模式..)
  • ThreadPool:这些是长时间运行的操作,必须按的顺序运行。所以我会考虑专门的线程是合乎逻辑的选择。
  • WeakReference:我只是想到了这个。也许这是做到这一点的正确方法(?)。基本上,线程保持一个WeakReference回到拥有的对象,并定期唤醒自己,以检查它是否仍然活着,当它死亡时它排入Terminate。不完全优雅 - 我不喜欢“定期唤醒自己” - 但这是最​​好的解决方案吗?

回答

2

IDisposable或类似的声音对我来说是最好的方法 - 明确地说你什么时候完成了制作,而不是从垃圾收集中触发。

基本上,这听起来像问题不是终止工作线程 - 它表明你已经完成了生产。我明白,在某些情况下这可能会很棘手,但如果在全部可能,它会让你的生活更具可预测性,如果你能明确地做到这一点。

+0

感谢乔恩,我想这是最好的方法。只是讨厌实现'IDisposable'的重大改变是什么(特别是对象的所有者需要开始实现它)。但是我认为这确实是确定性地关闭后台线程的唯一方法。叹息..我有很多工作在我面前。 – Mania 2011-06-16 06:28:06

+0

@Mania:你有我的同情心。可能值得考虑重新组织其他任何事情是否会让这个问题变得更简单。当您需要关闭制作人时,您是否还有其他类型的事件被解雇? – 2011-06-16 06:29:34

+0

不是。生产者的各种方法会添加到后台线程的队列中(稍后更新值),所以一旦主生产者丢弃了后台线程,它就不再具有存在的目的。所以逻辑上 - 这个生产者应该实现IDisposable。问题是基类和其他实现对后台线程没有同样的需求,所以我从来没有想过要实现IDisposable。但我同意,这是一个值得去做的改变。问候。 – Mania 2011-06-16 07:12:24

相关问题