【发布时间】:2012-09-14 14:28:42
【问题描述】:
我们可以一起工作,想出一些适用于 control-c、control-break、注销、按下窗口 X 按钮等的东西吗?
这是我目前所拥有的:
class Program
{
private static ConsoleEventHandlerDelegate consoleHandler;
delegate bool ConsoleEventHandlerDelegate(CtrlTypes eventCode);
static void Main(string[] args)
{
consoleHandler = new ConsoleEventHandlerDelegate(ConsoleCtrlCheck);
SetConsoleCtrlHandler(consoleHandler, true);
System.Diagnostics.Process.GetCurrentProcess().Exited
+= delegate(object sender, EventArgs e)
{
GeneralManager.Stop();
};
Console.CancelKeyPress += delegate(object sender,
ConsoleCancelEventArgs e)
{
e.Cancel = false;
GeneralManager.Stop();
};
GeneralManager.Start();
}
private static bool ConsoleCtrlCheck(CtrlTypes ctrlType)
{
switch (ctrlType)
{
case CtrlTypes.CTRL_C_EVENT:
Console.WriteLine("CTRL+C received!");
GeneralManager.Stop();
break;
case CtrlTypes.CTRL_BREAK_EVENT:
isclosing = true;
Console.WriteLine("CTRL+BREAK received!");
GeneralManager.Stop();
break;
case CtrlTypes.CTRL_CLOSE_EVENT:
Console.WriteLine("Program being closed!");
GeneralManager.Stop();
break;
case CtrlTypes.CTRL_LOGOFF_EVENT:
case CtrlTypes.CTRL_SHUTDOWN_EVENT:
Console.WriteLine("User is logging off!");
GeneralManager.Stop();
break;
}
return true;
}
#region unmanaged
[DllImport("kernel32.dll")]
static extern bool SetConsoleCtrlHandler(ConsoleEventHandlerDelegate
handlerProc, bool add);
public delegate bool HandlerRoutine(CtrlTypes CtrlType);
public enum CtrlTypes
{
CTRL_C_EVENT = 0,
CTRL_BREAK_EVENT,
CTRL_CLOSE_EVENT,
CTRL_LOGOFF_EVENT = 5,
CTRL_SHUTDOWN_EVENT
}
#endregion
}
两个问题:
在 Managed Control-Break 处理程序中,如果我们设置
e.Cancel = true它会失败并出现 .Net4 异常。这在 MSDN 文章中注明,但没有解决方法:http://msdn.microsoft.com/en-us/library/system.consolecanceleventargs.cancel.aspx我不知道如何取消
ConsoleCtrlCheck中的关闭。我有一两秒钟的时间来做一些清理工作,但我宁愿取消并确保一切都正确完成。
更新:
感谢您的回复。两者都赞成。将等待看看是否有人可以提出直接解决我要求的答复,否则将接受“使用 NT 服务”答案之一。
【问题讨论】:
-
一个程序在被告知退出时不退出称为恶意软件
-
Protip:不要尝试这个。这不值得。
-
您假设它是一个客户端应用程序。它是用于服务器的,我想确保如果有人意外击中 X,则运行清理例程。另一种方法是将其作为服务运行......但我喜欢看到控制台。
-
“清理”到底是什么意思?关闭时可能需要执行一些逻辑,但您不必担心资源问题。
-
你有一个开放的 TCP 服务器作为控制台运行,人们可能会关闭它?
标签: c# .net console-application shutdown resource-cleanup