【问题标题】:Listen for key press .NET console app does not stop running application监听按键 .NET 控制台应用程序不会停止运行应用程序
【发布时间】:2021-10-31 04:08:57
【问题描述】:

我一直在研究如何在按下 esc(或任何键)时停止控制台应用程序。

我遇到了这个解决方案 Listen for key press in .NET console app

现在,我试图将其应用于我的案例: 当我按任意键时,我应该停止我的控制台应用程序,这是一个循环。

根据上述主题中提供的解决方案,我添加了自己的部分,如下所示:

  Console.WriteLine("Press ESC to stop");
    do {
        while (! Console.KeyAvailable) {
            
            foreach (var station in WeatherStations.station)
            {
                var stationAirParams = station.value?.FirstOrDefault();

                Console.WriteLine(
                    station.name + " " + (stationAirParams == null 
                        ? "" 
                        : stationAirParams.value)
                );
                Thread.Sleep(100);
            }
        }       
    } while (Console.ReadKey(true).Key != ConsoleKey.Escape);

也就是说……为什么循环没有停止?

【问题讨论】:

  • 它会一直枚举站并且每次等待十分之一秒。处理完所有站都不退出吗?
  • 没错,它会像您所说的那样枚举站点,并在所有站点都被处理后停止。问题是当我按 esc 或任何键时,什么都没有发生

标签: c# .net loops


【解决方案1】:

您的方法在单个线程中使用轮询,它不是事件驱动的。
内循环不会在按键时停止。它会在代码第一次在外部循环中检查按键之前完成它的工作。

像下面这样移动一个中止条件

 if(Console.KeyAvailable && Console.ReadKey(true).Key == ConsoleKey.Escape)
 {
     break;
 }

到最里面的循环。

还有另一个答案here,它显示了如何在等待按键退出主线程时生成后台线程来完成工作。

【讨论】:

  • 感谢您的回答。您对我如何通过按任意键(不仅仅是 ESC)停止外观有什么建议
  • 只检查KeyAvailable,删除条件的第二部分
猜你喜欢
  • 2023-03-14
  • 2013-06-10
  • 1970-01-01
  • 1970-01-01
  • 2011-01-22
  • 1970-01-01
  • 1970-01-01
  • 2014-03-25
相关资源
最近更新 更多