Как вызвать событие перед Environment.Exit ()? - PullRequest
9 голосов
/ 03 декабря 2009

У меня есть консольное приложение на C #. Если что-то идет не так, я звоню Environment.Exit(), чтобы закрыть приложение. Мне нужно отключиться от сервера и закрыть некоторые файлы до завершения приложения.

В Java я могу реализовать хук отключения и зарегистрировать его через Runtime.getRuntime().addShutdownHook(). Как я могу добиться того же в C #?

Ответы [ 3 ]

24 голосов
/ 03 декабря 2009

Вы можете прикрепить обработчик события к событию ProcessExit текущего домена приложения:

using System;
class Program
{
    static void Main(string[] args)
    {
        AppDomain.CurrentDomain.ProcessExit += (s, e) => Console.WriteLine("Process exiting");
        Environment.Exit(0);
    }
}
10 голосов
/ 03 декабря 2009

Hook AppDomain события:

private static void Main(string[] args)
{
    var domain = AppDomain.CurrentDomain;
    domain.UnhandledException += new UnhandledExceptionEventHandler(MyHandler);
    domain.ProcessExit += new EventHandler(domain_ProcessExit);
    domain.DomainUnload += new EventHandler(domain_DomainUnload);
}
static void MyHandler(object sender, UnhandledExceptionEventArgs args)
{
    Exception e = (Exception)args.ExceptionObject;
    Console.WriteLine("MyHandler caught: " + e.Message);
}

static void domain_ProcessExit(object sender, EventArgs e)
{
}
static void domain_DomainUnload(object sender, EventArgs e)
{
}
0 голосов
/ 03 декабря 2009

Я бы рекомендовал обернуть вызов Environment.Exit () в свой собственный метод и использовать его повсюду. Примерно так:

internal static void MyExit(int exitCode){
    // disconnect from network streams
    // ensure file connections are disposed
    // etc.
    Environment.Exit(exitCode);
}
...