Ctrl + C始终退出进程

时间:2016-04-26 10:14:48

标签: c#

当用户按 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

1 个答案:

答案 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}}。