2

我有一个对象,它有一个BackgroundWorker线程(纯粹是一个动作委托队列)。即,这是常见的、简单的单一生产者单一消费者场景。

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

这听起来很容易——使用终结器——但这违反了“不要在终结器中触及托管资源”的规则。

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

我宁愿不接受的答案:

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

1 回答 1

2

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

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

于 2011-06-16T06:05:29.267 回答