Как связать фоновый поток с временем жизни объекта? - PullRequest
1 голос
/ 08 апреля 2010

Я хочу создать фоновый поток, который принадлежит объекту. Когда этот объект больше не нужен, то же самое относится и к фоновому потоку.

псевдокод того, что у меня сейчас есть:

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?

1 Ответ

1 голос
/ 08 апреля 2010

Завершить это правильное место, чтобы сделать это. Просто проверьте, не ноль ли это.

...