Общий способ выхода из приложения .NET - PullRequest
22 голосов
/ 20 января 2011

Я понимаю, что существует несколько способов выхода из приложения, таких как Application.Exit (), Application.ExitThread (), Environment.Exit () и т. Д.

У меня есть внешняя библиотека "commons", и я пытаюсь создать общий метод FailIf, который регистрирует сбой в журналах, делает то и это и то и это, а затем, наконец, выходит из приложения ... вот короткая версия.

    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);
        }
    }

Я прочитал, что использование Environment.Exit - не лучший способ справиться с проблемами, когда речь идет о приложениях WinForm, а также при работе с приложениями WPF и Silverlight есть разные способы выхода ... Мой вопрос действительно:

Что я должен сделать, чтобы выйти изящно, чтобы охватить все типы приложений?

Ответы [ 3 ]

29 голосов
/ 20 января 2011

Прочтите это о разнице между использованием Environment и Application:

Application.Exit Vs Environment.Exit

Пример того, что вы хотите делатьнижняя часть этой страницы:

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);
}
3 голосов
/ 22 января 2011

Если это просто прерывание, используйте Environment.Exit().Если это что-то очень важное (что не может выполнить какую-либо очистку), используйте Environment.FailFast().

0 голосов
/ 21 января 2011

Я бы рекомендовал использовать базовую обработку исключений, поэтому вместо System.Environment.Exit (1) выведите новое ApplicationException (сообщение), которое вызывает исключение для основного метода, в вашем случае что-то вроде этого:

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

Просто убедитесь, что вы выбросили исключение из основного потока, иначе вызовите его перед выбрасыванием конечно

...