在 CancelKeyPress 事件被触发之前,如何保持控制台打开?(How can I keep a console open until CancelKeyPress event is fired?)

问题

只要 CancelKeyPress 事件没有被触发,保持控制台应用程序打开的最佳方法是什么?

我不想使用 Console.Read 或 Console.ReadLine 因为我不想接受输入。 我只想让底层应用程序在触发时打印到控制台事件详细信息。 然后一旦 CancelKeyPress 事件被触发,我想优雅地关闭应用程序。

回答1

我假设“正常关闭应用程序”是您在这里挣扎的部分。 否则您的应用程序将在 ctrl-c 时自动退出。 您应该更改标题。

这是我认为您需要的快速演示。 可以通过使用锁定和监视器进行通知来进一步完善它。 我不确定你到底需要什么,所以我只是摆出这个......

class Program
{

    private static volatile bool _s_stop = false;

    public static void Main(string[] args)
    {
        Console.CancelKeyPress += new ConsoleCancelEventHandler(Console_CancelKeyPress);
        while (!_s_stop)
        {
            /* put real logic here */
            Console.WriteLine("still running at {0}", DateTime.Now);
            Thread.Sleep(3000);
        }
        Console.WriteLine("Graceful shut down code here...");

        //don't leave this...  demonstration purposes only...
        Console.ReadLine();
    }

    static void Console_CancelKeyPress(object sender, ConsoleCancelEventArgs e)
    {
        //you have 2 options here, leave e.Cancel set to false and just handle any
        //graceful shutdown that you can while in here, or set a flag to notify the other
        //thread at the next check that it's to shut down.  I'll do the 2nd option
        e.Cancel = true;
        _s_stop = true;
        Console.WriteLine("CancelKeyPress fired...");
    }

}

_s_stop 布尔值应该被声明为 volatile 或者过于雄心勃勃的优化器可能会导致程序无限循环。

回答2

_s_stop布尔值应该在示例代码中声明为 volatile,否则过于雄心勃勃的优化器可能会导致程序无限循环。

回答3

已经有一个绑定到 CancelKeyPress 的处理程序可以终止您的应用程序,挂接它的唯一原因是您想拦截事件并防止应用程序关闭。

在您的情况下,只需将您的应用程序放入一个无限循环中,然后让内置的事件处理程序杀死它。 您可能需要考虑使用诸如 Wait(1) 之类的东西或后台进程来防止它在无所事事的情况下使用大量 CPU。

回答4

这可能是您正在寻找的:

http://msdn.microsoft.com/en-us/library/system.console.cancelkeypress.aspx

回答5

只需在键盘上按CTRL + f5而不是 F5(调试)运行您的程序或代码,无需调试。

标签

更多相关内容:请点击查看