【问题标题】:Keep console window open保持控制台窗口打开
【发布时间】:2014-04-20 06:32:28
【问题描述】:

这就是我现在保持控制台窗口打开的方式:

private static void Main(string[] args)
{
    // Timers run here

    while(true)
    {
        Console.Read();
    }
}

但它总是会回到我身边:一定有更好的方法。 Console.Read() 在永恒的while 中的原因是因为我不希望我的程序在运行时误按enter 并且我专注于它的窗口时终止。

有什么想法吗?

没有回答我的问题的相关问题:

【问题讨论】:

  • 您希望控制台窗口在执行某些工作时保持打开状态?
  • 这看起来像您在 完成其工作后保持窗口打开。通常像单个Console.ReadLine()(带有“按回车键关闭”的消息)之类的东西是保持窗口打开直到用户关闭它的标准方法。
  • 你可能想使用多线程,是吗?
  • @DougPeters:啊,现在更有意义了。您希望后台任务在应用程序关闭之前完成。在那种情况下,我想知道这里的整体架构是否存在问题。如果这应该是一个带有计时器的“始终运行”的应用程序,那么 Windows 服务可能会更好地工作吗?或者将定时组件分解成它们自己的应用程序,并用主机操作系统中的预定作业替换计时器?如果它们只需要单次运行的后台任务,那么也许可以代替计时器使用类似并行任务的东西并在最后等待这些任务?
  • @DougPeters 是否正在重构以使用 .NET 任务框架并使用 Task.WaitAll() 选项? msdn.microsoft.com/en-us/library/dd270695(v=vs.110).aspx

标签: c# console-application


【解决方案1】:

鉴于迄今为止在 cmets 中的讨论,我的第一个建议肯定是为此创建一个 System Tray application。这将允许用户交互和通知,而不必在桌面上保留控制台窗口。

如果做不到这一点,您或许可以在控制台中实现类似“游戏循环”的功能。统计数据需要多“实时”?可能延迟一秒?像这样的:

while (true)
{
    Thread.Sleep(1000);
    DisplayCurrentStats();
}

这会暂停主线程(并不总是推荐,但它您试图在此处保持打开的 UI),然后每秒输出一次显示。 (如果输出已经由其他东西处理,并且出于任何原因不应该在这里移动,请忽略该部分。)

你可能仍然想要一些方法来打破整个事情。也许是转义输入:

while (true)
{
    Thread.Sleep(1000);
    DisplayCurrentStats();
    var escape = Console.Read();
    if (IsEscapeCharacter(escape))
        break;
}
OutputGoodByeMessage();

IsEscapeCharacter() 方法中,您可以检查从控制台读取的字符(如果有的话)是否与预期的“转义”字符匹配。 (esc 键似乎是一个标准选择,但为了隐蔽性,您可以使用其他任何东西来尝试防止“意外逃逸”。)这将允许您在需要时干净地终止应用程序。

它仍然以 1 秒的延迟增量,这并不理想。尽管即使在 1/10 秒时,它仍将大部分时间用于睡眠(也就是说,消耗计算资源)同时提供了一些不错的 UI 响应能力(谁抱怨 1/10 秒延迟?):

Thread.Sleep(100);

【讨论】:

  • +1 这也是一种不错的直接方法。
  • 游戏循环足够正常 - 我喜欢它
【解决方案2】:

我假设您想在后台运行任务,因此您应该只启动一个线程,如下所示:

private static void Main(string[] args)
{
    new Thread(new ThreadStart(SomeThreadFunction)).Start();

    while(true)
    {
        Console.Read();
    }
}

static void SomeThreadFunction()
{
  while(true) {
    Console.WriteLine("Tick");
    Thread.Sleep(1000);
  }
}

【讨论】:

  • +1 这个看起来很可靠。它还解决了计时器相互重叠的问题(或者可能不重叠?)。
【解决方案3】:

如果我误按了 Enter,我不希望我的程序终止

你想要一些类似的东西:

while (Console.ReadKey(true).Key == ConsoleKey.Enter)
{
    Console.Read();
}

上面的代码按ENTER键不退出,但按其他键退出。

【讨论】:

    猜你喜欢
    • 2010-12-26
    • 2013-06-01
    • 2011-07-01
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 2010-10-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多