我想创建一个由对象拥有的后台线程。当不再需要该对象时,它的后台线程也是如此。
我目前拥有的伪代码:
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,我怎么能停止后台线程?
答案 0 :(得分:1)
Finalize是正确的地方。检查是不是空。