2010-08-11 13 views
16

Czy finalizatory są gwarantowane do uruchomienia w .NET w pewnym momencie (dodatkowe przerwy w zasilaniu i tym podobne)? Wiem, jak działa GC i że jest niedeterministyczny, kiedy dokładnie będą działać.Czy finalizatory .net są zawsze wykonywane?

(Wyszukiwarka nie wyświetlała dobrych odpowiedzi, dlatego dodam to pytanie w oczekiwaniu na połączenie z niezbyt łatwymi do odkrycia rzeczywistymi odpowiedziami, poza tym już znam odpowiedź i dodam go po kilku dniach, na wypadek gdyby nikt o tym nie wspomniał.)

Odpowiedz

24

finalizatory może faktycznie być nigdy wykonany, jak Raymond Chen explains. Zabawne, że to pytanie jest zadawane podczas swojej rocznej CLR tygodnia, zaledwie dwa dni po tym, jak wyjaśnił :)

Dla leniwych, The (a raczej jeden) wniosek jest taki:

Prawidłowo -pisany program nie może zakładać, że finalizatorzy kiedykolwiek będą działać.

Jeśli zastanawiasz się, czy możesz polegać na finalizatorach, to już wszystko, co musisz wiedzieć: nie polegaj na finalizatorach.

Jak Raymond Chen twierdzi również w połączonej artykuł:

finalizatory stanowią zabezpieczenie, a nie podstawowym środkiem do regeneracji zasobów.

Jeśli szukasz sposobu na uwolnienie zasobów, spójrz na wzór Jednorazowego użytku.


finalizator nie może działać, na przykład, w przypadku gdy:

  • Innym finalizator zgłasza wyjątek.
  • Kolejny finalizator zajmuje więcej niż 2 sekundy.
  • Wszystkie finalizatory łącznie trwają ponad 40 sekund.
  • AppDomain awarii lub jest rozładowany (choć można obejść ten krytycznym finalizatora (CriticalFinalizerObject, SafeHandle czy coś takiego)
  • Nie garbage collection występuje
  • Proces wywala

(uwaga: Wartości czasu mogły się zmienić z czasem, but were certainly true some time ago.)

Sądzę, że istnieje wiele innych rzeczy, które mogą sprawić, że finalizatorzy nigdy nie będą działali. Najważniejsze jest to, że poza tym cytatem od pana Chena, finalizatorzy są siatka bezpieczeństwa th na zmniejszyć wpływ błędów, ponieważ na przykład zasoby są wydawane kiedyś, co jest lepsze niż nigdy, jeśli zapomnisz zrobić to explicity.

+0

Czy mógłbyś zacytować więcej ważnych części? I tak, być może pytający czekał właśnie na ten link. ;) – mafu

+0

W rzeczywistości, ponieważ wiele osób pyta, jak mogą polegać na zachowaniu finalizatora, myślę, że * przytoczyłem * najważniejszą część;) Z drugiej strony, inne pola w tym artykule mogą być interesujące. – OregonGhost

+0

@OregonGhost: Czy rozumiem to dobrze: jeśli 20 finalizatorów zajmuje po 1,95 sekundy każdy, to jest hunky dory i wszystko wykonamy - biorąc 39 sekund. Jeśli zajmie to 2,05 sekundy, wykonywanie wszystkich pozostałych jest pomijane. To wydaje się raczej zepsute. Raczej brutalne przerywanie finalizatora, który trwa ponad 2 sekundy, w celu umożliwienia innym uruchomieniu przez pozostałą część 40-sekundowego limitu czasu, będzie dobrą cechą. Ale odwiercanie rzeczy po dwóch sekundach wydaje się błędne. – supercat

6

Jeśli finalizator zgłasza wyjątek, inne finalizatory nie zostaną uruchomione.

Można również zablokować finalizatory, jeśli wywołasz na obiekcie obiekt SuppressFinalizer.

Od MSDN (Object.Finalize):

Sposób finalizacja może nie działać do zakończenia lub może nie działać w ogóle w następujących wyjątkowych okolicznościach:

  • Another bloki finalizatora nieskończoność (idzie w nieskończoną pętlę, próbuje uzyskać blokadę, której nigdy nie uzyska i tak dalej). Ponieważ środowisko wykonawcze próbuje uruchomić finalizatory do zakończenia, inne finalizatory mogą nie zostać wywołane, jeśli finalizator blokuje się w nieskończoność.
  • Proces kończy się bez możliwości wyczyszczenia środowiska wykonawczego. W takim przypadku pierwszym powiadomieniem o zakończeniu procesu jest powiadomienie DLL_PROCESS_DETACH.
+0

Czy możesz dodać źródło dla części "wyjątek"? – mafu

+0

Należy zauważyć, że "weszła w nieskończoną pętlę" w implementacji CLR oznacza "zajmuje więcej niż dwie sekundy", jak wyjaśniono tutaj: http://nitoprograms.blogspot.com/2009/08/finalizers-at-process- exit.html – OregonGhost

+0

@mafutrct - Zobacz tutaj: http://stackoverflow.com/questions/1538630/exceptions-during-finalize-what-methodology-are-you-using-to-detect-garbage-co – Oded

Powiązane problemy