2009-11-11 9 views
10

Zauważyłem, że System.Threading.Thread implementuje finalizator, ale nie może go identyfikować. Zalecaną praktyką jest zawsze wdrażanie IDisposable po zaimplementowaniu finalizatora. Jeffrey Richter, że wytyczne są "bardzo ważne i zawsze powinny być przestrzegane bez wyjątku".Dlaczego wątek nie implementuje IDisposable?

Dlaczego więc wątek nie implementuje IDisposable? Wygląda na to, że implementacja IDisposable byłaby niezłamaną zmianą, która pozwoliłaby na deterministyczne oczyszczenie z możliwych do sfinalizowania zasobów Thread.

I powiązane pytanie: ponieważ wątek jest finalizowany, czy muszę przechowywać odniesienia do uruchomionych wątków, aby zapobiec ich sfinalizowaniu podczas wykonywania?

Odpowiedz

8

Co zrobiłby pozbyć się obiektu Thread? "Zasób" w tym przypadku ma swoje naturalne oczyszczanie - wykończenie nici. Zwróć uwagę, że nie masz również poczucia własności ... w wątku wykonawczym zawsze możesz użyć Thread.CurrentThread, więc tylko ten wątek może w rzeczywistości odebrać prawo własności.

Zasadniczo uważam, że Thread jest dość niecodziennym przypadkiem - istnieje całe życie bazowego zasobu, ale nie jest to coś, co powinno zostać wyczyszczone jawnie.

+0

Ponieważ ManagedThreadID jest liczbą całkowitą i można go odczytać nawet przed uruchomieniem wątku, sugerowałoby to, że coś zostało przydzielone, gdy wątek zostanie utworzony (nawet jeśli tylko sam numer). Chociaż byłoby dziwne, że aplikacja tworzy 2 + miliardy obiektów Threads, wydaje się, że identyfikatory byłyby zasobem, który mógłby być wart wydania. – supercat

+0

@supercat: Interesujący punkt. "ManagedThreadId" wydaje się być przydzielane sekwencyjnie - nie wiem, co by się stało po utworzeniu ponad 2 miliardy z nich. –

+0

Identyfikatory wydają się być ponownie używane, gdy obiekty wątku kwalifikują się do sfinalizowania, więc podejrzewam, że wątek Threading.Thread implementuje finalizację, ale nie umożliwia IDIspozycji. – supercat

3

To prawdopodobnie dlatego, że nie można zbyć wątku. Zamiast tego możesz poprosić go, aby umarł przy użyciu metody Abort() lub podobnej.

+0

Można, ale w ogólności, użycie Przerywania nie jest uważane za dobrą praktykę - wystarczy upewnić się, że metoda powrotu nici (używając bool lub podobnego) i system wyczyści resztę. –

1

Jest to rodzaj pytania projektowego, więc każdy, kto nie był zaangażowany w budowę tego aspektu .NET, może jedynie spekulować. Biorąc to pod uwagę, this blog post ma rację:

... implementacja IDisposable nie przyniosłaby żadnej różnicy, przynajmniej w obecnej wersji wątku. I wzrosła liczba wątków tworzone i hrabia uchwyt spada w pewnym momencie więc istnieje jakiś mechanizm ich zamykania

wątki nie naturalnie posprzątać po sobie, więc nie są zasobem, który musi być zarządzany w typowym tego słowa znaczeniu.

Powiązane problemy