我有一个C#控制台应用程序。如果出现问题,我会调用Environment.Exit()
来关闭我的应用程序。在应用程序结束之前,我需要从服务器断开连接并关闭一些文件。
在Java中,我可以通过实现一个关闭挂钩并通过Runtime.getRuntime().addShutdownHook()
注册它来实现。那么我该如何在C#中实现相同的功能呢?
我有一个C#控制台应用程序。如果出现问题,我会调用Environment.Exit()
来关闭我的应用程序。在应用程序结束之前,我需要从服务器断开连接并关闭一些文件。
在Java中,我可以通过实现一个关闭挂钩并通过Runtime.getRuntime().addShutdownHook()
注册它来实现。那么我该如何在C#中实现相同的功能呢?
你可以将事件处理程序附加到当前应用程序域的ProcessExit事件:
using System;
class Program
{
static void Main(string[] args)
{
AppDomain.CurrentDomain.ProcessExit += (s, e) => Console.WriteLine("Process exiting");
Environment.Exit(0);
}
}
挂钩 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)
{
}
internal static void MyExit(int exitCode){
// disconnect from network streams
// ensure file connections are disposed
// etc.
Environment.Exit(exitCode);
}
MyExit
不会被调用。但仍然是一个有效的答案。不认为这应该被投反对票。 - nawfal