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