2009-12-03 56 views
7

Tôi có một ứng dụng giao diện điều khiển trong C#. Nếu có sự cố, tôi gọi số Environment.Exit() để đóng đơn đăng ký của tôi. Tôi cần ngắt kết nối khỏi máy chủ và đóng một số tệp trước khi ứng dụng kết thúc.Cách gọi sự kiện trước khi Environment.Exit()?

Trong Java, tôi có thể triển khai móc tắt máy và đăng ký nó qua Runtime.getRuntime().addShutdownHook(). Làm thế nào tôi có thể đạt được như vậy trong C#?

Trả lời

18

Bạn có thể đính kèm một xử lý sự kiện cho sự kiện ProcessExit ứng dụng tên miền hiện tại của:

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

Tôi không thích lambda :). Nhưng cảm ơn, thử bệnh. – Makah

-2

Tôi khuyên bạn nên kết thúc cuộc gọi đến Environment.Exit() theo phương pháp của riêng bạn và sử dụng nó trong suốt. Một cái gì đó như thế này:

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

không tồn tại trong C# một lối ra biến cố? – Makah

+1

-1: Điều này làm tăng đáng kể Khớp nối khi có các cách * dễ dàng khác * để làm cho mọi thứ hoạt động mà không cần điều này: http://en.wikipedia.org/wiki/Coupling_(computer_science) –

+0

làm thế nào nó có thể tăng sự ghép nối? Câu hỏi đặt ra là hỏi về cách giải quyết vấn đề này trong một ứng dụng Console, vì vậy hãy gọi Environment.Exit sẽ là một hành động hợp lệ. Cấp bằng cách sử dụng các sự kiện sẽ được dễ dàng hơn, nhưng họ đang đi ngược lại AppDomain, không phải là quá trình. –

9

Hook AppDomain sự kiện:

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) 
{ 
} 
Các vấn đề liên quan