收集所属对象时,如何终止工作线程

本文关键字:终止 线程 工作 何终止 对象 | 更新日期: 2023-09-27 17:59:11

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

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

这听起来很简单——使用终结器——但这打破了"不要在终结器中接触托管资源"的规则。

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

我宁愿不接受的答案:

  • IDisposable:这需要对基类进行大规模的突破性更改,但我承认这可能是必需的(这似乎总是IDisposable模式的问题。)
  • ThreadPool:这些是长时间运行的操作,必须按的顺序运行。因此,我认为专用线程是合乎逻辑的选择
  • WeakReference:我刚刚想到了这个。也许这是正确的做法(?)。基本上,线程将一个WeakReference保留回拥有对象,并定期唤醒自己以检查该WeakReference是否仍然有效,当它死亡时,它会将Terminate排入队列。不太优雅——我不喜欢"周期性地自我唤醒"——但这是最好的解决方案吗

收集所属对象时,如何终止工作线程

IDisposable或类似的东西对我来说听起来是最好的方法——明确地说你什么时候完成了生产,而不是从垃圾收集中触发。

从根本上讲,问题听起来并不是终止工作线程,而是表明您已经完成了生产。我确实理解在某些情况下这可能很棘手,但如果在所有都有可能的话,如果你能明确地做到这一点,你的生活会变得更可预测。