gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 11:35:40 25 4
gpt4 key购买 nike

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

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

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

那么如何确保线程在没有更多工作要做时干净地终止?

我不想接受的答案:

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

最佳答案

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

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

关于c# - 收集拥有对象时如何终止工作线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6367727/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com