2009-12-03 4 views
7

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

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

ответ

18

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

using System; 
class Program 
{ 
    static void Main(string[] args) 
    { 
     AppDomain.CurrentDomain.ProcessExit += (s, e) => Console.WriteLine("Process exiting"); 
     Environment.Exit(0); 
    } 
} 
+1

Мне не нравится лямбда :). Но спасибо, плохо попробуйте. – Makah

-2

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

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

не существует в C# выездную мероприятие? – Makah

+1

-1: Это значительно увеличивает сцепление, когда есть другие * легкие * способы заставить все работать без этого: http://en.wikipedia.org/wiki/Coupling_(computer_science) –

+0

как бы увеличить сцепление? Вопрос заключается в том, как решить эту проблему в приложении Console, поэтому вызов Environment.Exit будет действительным действием. Конечно, использование событий будет проще, но они идут против AppDomain, а не процесса. –

9

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) 
{ 
} 
Смежные вопросы