我有一个包含大量线程的控制台应用程序.有些线程监视某些条件,如果条件为真,则终止程序.这种终止可以在任何时候发生.
我需要一个可以在程序关闭时触发的事件,以便我可以清理所有其他线程,并正确关闭所有文件句柄和连接.我不确定是否有一个已经内置到.NET框架,所以在编写自己的.
我想知道是否有这样的活动:
MyConsoleProgram.OnExit += CleanupBeforeExit;
我有一个包含大量线程的控制台应用程序.有些线程监视某些条件,如果条件为真,则终止程序.这种终止可以在任何时候发生.
我需要一个可以在程序关闭时触发的事件,以便我可以清理所有其他线程,并正确关闭所有文件句柄和连接.我不确定是否有一个已经内置到.NET框架,所以在编写自己的.
我想知道是否有这样的活动:
MyConsoleProgram.OnExit += CleanupBeforeExit;
我不确定我在网上哪里找到了代码,但我现在在我的一个老项目中找到了它.这将允许您在控制台中执行清理代码,例如,当控制台突然关闭或由于关机...
[DllImport("Kernel32")]
private static extern bool SetConsoleCtrlHandler(EventHandler handler, bool add);
private delegate bool EventHandler(CtrlType sig);
static EventHandler _handler;
enum CtrlType
{
CTRL_C_EVENT = 0,
CTRL_BREAK_EVENT = 1,
CTRL_CLOSE_EVENT = 2,
CTRL_LOGOFF_EVENT = 5,
CTRL_SHUTDOWN_EVENT = 6
}
private static bool Handler(CtrlType sig)
{
switch (sig)
{
case CtrlType.CTRL_C_EVENT:
case CtrlType.CTRL_LOGOFF_EVENT:
case CtrlType.CTRL_SHUTDOWN_EVENT:
case CtrlType.CTRL_CLOSE_EVENT:
default:
return false;
}
}
static void Main(string[] args)
{
// Some biolerplate to react to close window event
_handler += new EventHandler(Handler);
SetConsoleCtrlHandler(_handler, true);
...
}
Update个
对于那些不判断 comments 的人来说,这个特定的解决方案似乎在Windows 7上运行良好(或根本不起作用).下面的thread条讨论了这一点