2010-04-27 12 views
5

Robię niektóre wielowątkowość i używam AutoResetEvents, a ManualResetEvents kontrolują moją główną pętlę. Kiedy "odślepiam" nici, które muszę również wyrzucić, to jest jasne.Jak prawidłowo pozbyć się waithandle

Ale widziałem różne sposoby, jak pozbyć Waithandles, i nie jestem pewien, który z nich jest poprawna:

Wersja 1

if (disposing) 
{ 
this.threadExitEvent.SafeWaitHandle.Dispose(); 
this.threadExitEvent.Close(); 
this.threadExitEvent = null; 
.... 
} 

Wersja 2

if (disposing) 
{ 
this.threadExitEvent.Close(); 
this.threadExitEvent = null; 
.... 
} 

Wersja 3

if (disposing) 
{ 
this.threadExitEvent.Close(); 
.... 
} 

Odpowiedz

6

wersja 2 jest tym, z czym chciałbym się zmierzyć, ponieważ nie ma (prawdopodobnie) potrzeby trzymania się twojego świeżo porzuconego WaitHandle, więc ustawienie go na null jest dobrym pomysłem. Ułatwia to również przystosowanie obiektu do odzyskania po usunięciu, ponieważ wszystko, co musisz zrobić, to sprawdzenie, czy wartość WaitHandle jest pusta i odtworzenie, jeśli tak jest.

Powiedział, że nikt nie będzie się bić swoją rękę dzieje z opcją 3.

Nie używaj opcji 1; na ogół złym pomysłem jest "docieranie do wnętrza" obiektów i rozpoczynanie rozporządzania członkami. Wywołanie Close (ponieważ metoda z IDisposable jest jawnie zaimplementowana i ma identyczny kod do Close) automatycznie zajmuje się pozbyciem się SafeWaitHandle. Nie rób tego sam.

+0

+ 1 - Całkowicie przeoczyłem fakt, że Dispose to jawna implementacja interfejsu (dzięki, Adam!) - z pewnością jest to droga do zrobienia. –

+0

Brzmi rozsądnie. Już zgadłem, że wersja 2 jest "najczystsza". Dzięki – TomTom

Powiązane problemy