我如何继续运行我的控制台应用程序,直到一个键按下(如Esc按下?)

我假设它环绕着一个while循环。我不喜欢ReadKey,因为它阻塞操作并要求一个键,而不是只是继续听按键。

如何做到这一点呢?


当前回答

使用以下代码,您可以在控制台执行过程中监听空格键,并暂停,直到按下另一个键,并选择监听Escape键,以打破主循环。

static ConsoleKeyInfo cki = new ConsoleKeyInfo();

while(true) {
      if (WaitOrBreak()) break;
      //your main code
}

private static bool WaitOrBreak(){
    if (Console.KeyAvailable) cki = Console.ReadKey(true);
    if (cki.Key == ConsoleKey.Spacebar)
    {
        Console.Write("waiting..");
        while (Console.KeyAvailable == false)
        {
            Thread.Sleep(250);Console.Write(".");
        }
        Console.WriteLine();
        Console.ReadKey(true);
        cki = new ConsoleKeyInfo();
    }
    if (cki.Key == ConsoleKey.Escape) return true;
    return false;
}

其他回答

最短的方法:

Console.WriteLine("Press ESC to stop");

while (!(Console.KeyAvailable && Console.ReadKey(true).Key == ConsoleKey.Escape))
{
    // do something
}

Console. readkey()是一个阻塞函数,它会停止程序的执行并等待按键,但多亏了检查Console。KeyAvailable键,while循环不会被阻塞,而是一直运行,直到按下Esc键。

下面是一种方法,可以让您在不同的线程上执行某些操作,并开始侦听不同线程中按下的键。当您的实际进程结束或用户按Esc键终止该进程时,控制台将停止其处理。

class SplitAnalyser
{
    public static bool stopProcessor = false;
    public static bool Terminate = false;

    static void Main(string[] args)
    {
        Console.ForegroundColor = ConsoleColor.Green;
        Console.WriteLine("Split Analyser starts");
        Console.ForegroundColor = ConsoleColor.Red;
        Console.WriteLine("Press Esc to quit.....");
        Thread MainThread = new Thread(new ThreadStart(startProcess));
        Thread ConsoleKeyListener = new Thread(new ThreadStart(ListerKeyBoardEvent));
        MainThread.Name = "Processor";
        ConsoleKeyListener.Name = "KeyListener";
        MainThread.Start();
        ConsoleKeyListener.Start();

        while (true) 
        {
            if (Terminate)
            {
                Console.WriteLine("Terminating Process...");
                MainThread.Abort();
                ConsoleKeyListener.Abort();
                Thread.Sleep(2000);
                Thread.CurrentThread.Abort();
                return;
            }

            if (stopProcessor)
            {
                Console.WriteLine("Ending Process...");
                MainThread.Abort();
                ConsoleKeyListener.Abort();
                Thread.Sleep(2000);
                Thread.CurrentThread.Abort();
                return;
            }
        } 
    }

    public static void ListerKeyBoardEvent()
    {
        do
        {
            if (Console.ReadKey(true).Key == ConsoleKey.Escape)
            {
                Terminate = true;
            }
        } while (true); 
    }

    public static void startProcess()
    {
        int i = 0;
        while (true)
        {
            if (!stopProcessor && !Terminate)
            {
                Console.ForegroundColor = ConsoleColor.White;
                Console.WriteLine("Processing...." + i++);
                Thread.Sleep(3000);
            }
            if(i==10)
                stopProcessor = true;

        }
    }

}

如果你正在使用Visual Studio,那么你可以在调试菜单中使用“开始不调试”。

它会自动写“按任意键继续…”到控制台完成应用程序后,它会让控制台为您打开,直到按下一个键。

使用以下代码,您可以在控制台执行过程中监听空格键,并暂停,直到按下另一个键,并选择监听Escape键,以打破主循环。

static ConsoleKeyInfo cki = new ConsoleKeyInfo();

while(true) {
      if (WaitOrBreak()) break;
      //your main code
}

private static bool WaitOrBreak(){
    if (Console.KeyAvailable) cki = Console.ReadKey(true);
    if (cki.Key == ConsoleKey.Spacebar)
    {
        Console.Write("waiting..");
        while (Console.KeyAvailable == false)
        {
            Thread.Sleep(250);Console.Write(".");
        }
        Console.WriteLine();
        Console.ReadKey(true);
        cki = new ConsoleKeyInfo();
    }
    if (cki.Key == ConsoleKey.Escape) return true;
    return false;
}

使用控制台。只有当你知道ReadKey不会被阻塞时,你才会调用ReadKey:

Console.WriteLine("Press ESC to stop");
do {
    while (! Console.KeyAvailable) {
        // Do something
   }       
} while (Console.ReadKey(true).Key != ConsoleKey.Escape);