2009-12-03 25 views
7

C# 'da bir konsol uygulamasına sahibim. Bir şeyler ters giderse, başvurumu kapatmak için Environment.Exit() numaralı telefonu arıyorum. Sunucunun bağlantısını kesmem ve uygulama bitmeden bazı dosyaları kapatmam gerekiyor.Environment.Exit() 'den önce olay nasıl çağrılır?

Java'da, bir kapatma kancası uygulayabilir ve Runtime.getRuntime().addShutdownHook() aracılığıyla kaydedebilirim. C# ile aynı şeyi nasıl yapabilirim?

cevap

18

:

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

Ben lambda sevmiyorum :). Ama teşekkürler, deneyin. – Makah

-2

Aramanızı kendi yönteminizdeki Environment.Exit() yöntemine sarmanızı ve bunu tamamlamanızı öneririz. Böyle bir şey: Geçerli uygulama etki alanının ProcessExit olayına bir olay işleyicisi ekleyebilirsiniz

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

C# bir çıkış mevcut değil Etkinlik? – Makah

+1

-1: Bu, işleri kolaylaştırmak için başka * kolay * yollar bulunduğunda, bağlantıyı önemli ölçüde artırır: http://en.wikipedia.org/wiki/Coupling_(computer_science) –

+0

Nasıl bağlanır? Soru bir Console uygulamasında bunun nasıl ele alınacağını sormaktır, böylece Environment.Exit çağrısı geçerli bir eylem olacaktır. Olayları kullanarak verilmiş daha kolay olurdu, ancak onlar AppDomain'e karşı çıkıyorlar, sürece değil. –

9

Kanca AppDomain olaylar:

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) 
{ 
} 
İlgili konular