2011-01-20 15 views
21

Rozumiem, że istnieje kilka sposobów na wyjście z aplikacji takich jak Application.Exit(),(), Application.ExitThread Environment.Exit() itpGeneric sposób, aby zamknąć aplikację .NET

Mam zewnętrzną bibliotekę "commons" i próbuję utworzyć ogólną metodę FailIf, która rejestruje awarię dzienników, robi to i tamto i to i tamto, a następnie kończy działanie aplikacji ... oto krótka wersja to.

public static void FailIf(Boolean fail, String message, Int32 exitCode = 1) 
    { 
     if (String.IsNullOrEmpty(message)) 
      throw new ArgumentNullException("message"); 

     if (fail) 
     { 
      //Do whatever I need to do 

      //Currently Environment.Exit(exitCode) 
      Environment.Exit(exitCode); 
     } 
    } 

Czytałem, że przy użyciu Environment.Exit nie jest najlepszym sposobem radzenia sobie z rzeczy, jeśli chodzi o aplikacje winform, a także podczas pracy z aplikacjami WPF i Silverlight istnieją różne sposoby na wyjście ... My Pytanie brzmi:

Co mam zrobić, aby wyjść z wdziękiem, aby objąć wszystkie typy aplikacji?

+3

Nie możesz po prostu rzucić wyjątku zamiast robić to, co jest oczywiste? –

Odpowiedz

25

Przeczytaj ten temat różnicy między użyciem środowiska i zastosowanie:

Application.Exit Vs Environment.Exit

Jest przykładem tego, co chcesz robić w dolnej części tej strony:

if (System.Windows.Forms.Application.MessageLoop) 
{ 
    // Use this since we are a WinForms app 
    System.Windows.Forms.Application.Exit(); 
} 
else 
{ 
    // Use this since we are a console app 
    System.Environment.Exit(1); 
} 
+0

Czy to też dotyczy aplikacji WPF? – michael

+0

Aplikacje WPF są zwykle uruchamiane za pomocą polecenia .Run() (Tak). –

0

Polecam przy użyciu podstawowej obsługi wyjątków, więc zamiast System.Environment.Exit (1) wyrzucamy nową wyjątek ApplicationException (komunikat), który propaguje wyjątek do głównej metody, w twoim przypadku coś takiego:

try{ 
Application.Run(new MyForm()); 
} 
catch(ApplicationException){ 
// do custom cleanup/reporting 
} 

Tylko upewnij się rzucić wyjątek od głównego wątku, jeszcze powołać się na niego przed wyrzuceniem oczywiście

+0

Jakiś czas, zanim ostatnio pracowałem z WinFormami, więc nie jestem pewien, czy połączenia są poprawne, ale przynajmniej wpadłeś na pomysł, spójrz także na Excepion – Polity

2

Jeśli to tylko przerwanie użyj Environment.Exit(). Jeśli jest to coś bardzo krytycznego (które nie może obsłużyć żadnego rodzaju czyszczenia), użyj Environment.FailFast().

Powiązane problemy