我有一个对象,它有一个BackgroundWorker
线程(纯粹是一个动作委托队列)。即,这是常见的、简单的单一生产者单一消费者场景。
当收集到单个生产者时,我希望它将 Terminate 动作排入BackgroundWorker
线程。
这听起来很容易——使用终结器——但这违反了“不要在终结器中触及托管资源”的规则。
那么,一旦没有更多工作要做,我如何确保线程干净地终止呢?
我宁愿不接受的答案:
IDisposable
:这将需要对基类进行大规模的重大更改,但我接受它可能是必需的(这似乎总是 IDisposable 模式的问题..)ThreadPool
: 这些都是长期运行的操作,必须按顺序运行。所以我认为专用线程是合乎逻辑的选择。WeakReference
: 刚想到这个。也许这是正确的方法(?)。基本上,线程保持WeakReference
对拥有对象的返回,并定期唤醒自己以检查它WeakReference
是否还活着,当它死亡时,它会加入一个 Terminate。不完全优雅-我不喜欢“定期唤醒自己”位-但这是最好的解决方案吗?