2010-04-08 3 views
1

개체가 소유하고있는 백그라운드 스레드를 만들고 싶습니다. 해당 객체가 더 이상 필요하지 않을 때 배경 스레드도 필요합니다. 내가 현재 가지고있는의배경 스레드를 객체의 수명까지 연결하는 방법은 무엇입니까?

의사 코드 :

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) 

문제는 누군가가 (하지 말라고 물론) 폐기()를 호출 잊어 버린 경우, 스레드가 중단되지 않을 것입니다. 내가 Finalize에 대해 이해 한 것은 이미 null-ed라고 가정해야하기 때문에 어떤 멤버도 참조 할 수 없다는 것입니다.

그렇다면 소유 객체가 있거나 그 객체가 있으면 어떻게 백그라운드 스레드를 멈출 수 있습니까?

답변

1

마무리는 올바른 작업입니다. 그냥 확인 null이 아닙니다.

+0

그래서 _isCanceled가 null 인 경우 어떻게합니까? 백그라운드 스레드를 사용하게 하시겠습니까? 그게 나에게 메모리 누출 냄새가 난다 ... –

+0

만약 그렇다면 그것은 수집되었고 트레드는 존재를 끝내야한다. 다른 방법은 스레드의 작성자에게 WeakReference를 가끔씩 확인하는 것입니다. – Andrey

+0

나는 WeakReference를 사용하는 것이 그때가는 길이라고 생각한다. 비록 그 스레드가 잠시 일어나도록해야한다는 것을 의미합니다. 쓰레드를 영원히 살게하는 것보다 더 나을 것이라고 생각합니다. –

관련 문제