当用户按 Ctrl + C 时,我不想关闭我的C#应用程序,所以我添加了以下代码:
static void Main(string[] args)
{
// some checks (only one instance running etc.)
Start(args);
Console.ReadLine();
}
public static void Start(string[] args)
{
Console.CancelKeyPress += new ConsoleCancelEventHandler(UserClose);
// Start infinity timer
_timer.Interval = 1000;
_timer.Elapsed += NewRun;
_timer.AutoReset = true;
_timer.Start();
}
public static void NewRun(Object sender, System.Timers.ElapsedEventArgs e)
{
_timer.Stop();
// Do the run
_timer.Start();
}
public static void UserClose(object sender, ConsoleCancelEventArgs args)
{
Console.WriteLine("\nThe read operation has been interrupted.");
Console.WriteLine(" Key pressed: {0}", args.SpecialKey);
Console.WriteLine(" Cancel property: {0}", args.Cancel);
// Set the Cancel property to true to prevent the process from terminating.
Console.WriteLine("Setting the Cancel property to true...");
args.Cancel = true;
// Announce the new value of the Cancel property.
Console.WriteLine(" Cancel property: {0}", args.Cancel);
Console.WriteLine("The read operation will resume...\n");
}
但不知何故,应用程序总是在UserClose函数之后终止。如何调试我的进程终止?上面的代码有什么问题?
更新 似乎主要回归(如评论中提到的RenéVogt)。但为什么时间停止了?
来源:MSDN
答案 0 :(得分:1)
您的问题是您的程序没有等待。它只是终止。
以下是详细情况:
Main
由框架调用
Main
来电Start
Start
初始化_timer
_timer
已启动Start
返回 Main
返回 Main
时,框架会终止流程 _timer
是您的进程的一部分,并且会将所有进程一起处理并从内存中删除。所以在Main
返回并且框架删除了进程之后,就没有更多的计时器了。
你需要让Main
不要回来,也许是这样:
static void Main(string[] args)
{
// some checks (only one instance running etc.)
Start(args);
while (true) Thread.Sleep(10);
}
注意 Console.ReadLine()
不幸地在这里不起作用,因为 Ctrl C 以某种方式触发Console.ReadLine()
返回{ {1}}。