Я хочу создать фоновый поток, который принадлежит объекту. Когда этот объект больше не нужен, то же самое относится и к фоновому потоку.
псевдокод того, что у меня сейчас есть:
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?