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.
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
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
@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