2012-07-13 11 views
12

Założono, że podczas kończenia debugowania (np. Poprzez naciśnięcie przycisku Stop lub naciśnięcie Shift + F5), każda klasa implementująca finalizator lub IDisposable zostanie, dobrze, usunięta.Wykonaj kod, gdy debuger VisualStudio kończy pracę:

Mam kilka klas, które implementują IDisposable. Jest kilka rzeczy, które chciałbym (spróbuj) i zrobić, gdy aplikacja wychodzi z debuggera (lub z powodu awarii w produkcji). Obecnie funkcja Dispose() nie jest wywoływana, ani finalizator. Czy istnieje sposób na wykonanie tej czynności?

+0

Dopóki katastrofa nie zostanie spowodowana przez wyjątek trapujący, nie ma gwarancji JAKIEGOKOLWIEK kodu działa po awarii. taka jest natura awarii aplikacji. Coś poszło nie tak i teraz twój proces został przymusowo zakończony. –

+1

@Boo Zrozumiano. Ale jeśli mogę uruchomić kod pod co najmniej podzbiorem scenariuszy, wezmę to. – CoolUserName

+0

Naciśnięcie przycisku zatrzymania w debugerze jest takie samo, jak system operacyjny zamykający aplikację.Jest to bezceremonialne i dość szaleńcze, bez względu na to, co aplikacja może robić lub zamierza zrobić. –

Odpowiedz

2

W przypadku normalnego zatrzymywania usług Windows, powinieneś umieścić swój kod w swojej metodzie Stop.

http://msdn.microsoft.com/en-us/library/system.serviceprocess.servicebase.stop.aspx

Ogólnie, rude wątku przerywa i niegrzeczny i zwalniania app domeny nie będą działać „normalne” finalizatory - można uzyskać więcej szczegółów w tym artykule MSDN.

https://web-beta.archive.org/web/20150423173148/https://msdn.microsoft.com/en-us/magazine/cc163716.aspx

Do tej pory, ja po prostu mówił o wątku przerywa jako skutek wykonywania rzucanie ThreadAbortException na wątku. Zazwyczaj spowoduje to zakończenie wątku. Jednak wątek może obsłużyć przerwanie wątku, uniemożliwiając zakończenie wątku. Aby to wyjaśnić, środowisko wykonawcze zapewnia bardziej wydajne działanie, trafnie nazwany niegrzeczny wątek przerywa. Nieostrożny wątek powoduje przerwanie wykonywania wątku. Gdy tak się stanie, CLR nie gwarantuje, że uruchomi się kod wycofania w wątku (chyba że kod jest wykonywany w CER). Niegrzecznie.

Podobnie, podczas gdy typowe rozładowanie domeny aplikacji zniesie wszystkie wątki w domenie, niegrzeczny wyładunek domeny aplikacji bezprawnie przerwie wszystkie wątki w domenie i nie zagwarantuje, że normalne finalizatory powiązane z obiektami w tej domenie będą działać . SQL Server 2005 jest jednym hostem CLR, który korzysta z nieuzasadnionych przerwań wątków i niegrzecznych wyładowań domen aplikacji w ramach polityki eskalacji. Gdy wystąpi wyjątek asynchroniczny, awaria alokacji zasobów zostanie uaktualniona do wątku przerwanego. A gdy dojdzie do przerwania wątku, jeśli nie zakończy się on w określonym przedziale czasowym określonym przez SQL Server, zostanie uaktualniony do niegrzecznego wątku. Podobnie, jeśli operacja wyładowania w domenie aplikacji nie zakończy się w określonym przedziale czasowym określonym przez SQL Server, zostanie ona uaktualniona do usuwania nieuprawnionej domeny aplikacji. (Zauważ, że właśnie opracowane zasady nie są dokładnie tym, czego używa SQL Server, ponieważ SQL Server bierze również pod uwagę, czy kod jest wykonywany w krytycznych regionach, ale więcej na ten temat wkrótce).

1

Cóż, CLR nie składa żadnych obietnic dotyczących tego, kiedy przedmioty będą zbierane lub usuwane.

Możesz spróbować wywołać śmieciarz jawnie, ale nie sądzę, że jest to zalecane podejście.

Najlepszą rzeczą do zrobienia jest użycie obiektów IDisposable wewnątrz bloku using.
To jedyny czas, kiedy masz gwarancję, że zostaną usunięte.

+2

FWIW, "używanie" to po prostu cukier składniowy na próbę/w końcu, więc nie jest to bardziej gwarantowane niż zwykły blok końcowy. –

+0

tak, to syntaktyczny cukier dla try/finally (Dispose()). patrz tutaj- "Instrukcja using zapewnia wywołanie Dispose, nawet jeśli wystąpi wyjątek podczas wywoływania metod na obiekcie. Możesz osiągnąć ten sam wynik, umieszczając obiekt wewnątrz bloku try, a następnie wywołując Dispos in finally block". http://msdn.microsoft.com/en-us/library/yh598w02%28v=vs.100%29.aspx –

Powiązane problemy