如何将后台线程绑定到对象的生命周期?

时间:2010-04-08 13:43:05

标签: .net multithreading garbage-collection

我想创建一个由对象拥有的后台线程。当不再需要该对象时,它的后台线程也是如此。

我目前拥有的伪代码:

ResetEvent _isCanceled
ResetEvent _hasWork
ThreadSafeQueue _workItems

Init()
  new BackgroundThread(ThreadLoop).Start()

AddWork(work)
  _workItems.Enqueue(work)
  _hasWork.Set()

Dispose()
  _isCanceled.Set()

ThreadLoop()
  while(!_isCanceled)
    if(_hasWork)
      Execute(_workItems.Dequeue())
    if(_workItems.IsEmpty)
      _hasWork.Reset()
    WaitHandle.WaitAny(_isCanceled, _hasWork)

问题是,如果有人(当然不是我)忘记调用Dispose(),那么线程永远不会被停止。我对Finalize的理解是你不能引用任何成员,因为你必须假设它们已经归零。

那么如果拥有对象是gc-ed还是gc-ed,我怎么能停止后台线程?

1 个答案:

答案 0 :(得分:1)

Finalize是正确的地方。检查是不是空。