【问题标题】:Alternative to Console.ReadLine() to keep the Console visible替代 Console.ReadLine() 以保持控制台可见
【发布时间】:2010-09-27 18:02:15
【问题描述】:

难道没有比 hackish Console.ReadLine() 调用更好看的声明(或方法)来防止控制台消失。更能表达、更正交于保持控制台可见的目的?

【问题讨论】:

  • 好吧,你希望它什么时候停止可见?
  • 为什么在程序没有调用时控制台关闭?假设我的程序中唯一的语句是 Console.WriteLine("Hello world");现在,您希望这个应用程序的正常执行看起来像什么??
  • 所有 .net 应用程序都以 main 方法开始,以大括号 ({) 开始,并在光标到达右大括号 (}) 时结束。所以你必须阻止光标 Bedir'e 到达右括号。要实现这一点,提供的最简单的方法是等待来自客户的 KEY。另一种方式,在您成功构建解决方案后,您可以通过命令提示符运行命令;所以命令提示符不会自行关闭。
  • Bedir'e 的意思是以前。抱歉,有时这种拼写控制会发疯。

标签: c#


【解决方案1】:

如果您仍在开发应用程序,您可以通过 Ctrl + F5 运行(无需调试) 否则你可以使用 Console.ReadKey() (相同但没有更多选项)

【讨论】:

    【解决方案2】:

    你可以这样做:

    Console.ReadKey();
    

    Console.ReadLine() 并不是真正的hackish,您暂停屏幕等待输入。输入可以是单个键,也可以是字符串。

    更新

    ReadKey() 方法的一个优点是它“等待,即阻塞发出 ReadKey 方法的线程,直到按下字符或功能键”。 MSDN

    这与读取字符串的 ReadLine 不同。可以说,更清洁。

    【讨论】:

    • 我几乎可以肯定 OP 会像他已经提到的解决方法一样对这个解决方案感到满意。
    • @jsmith,我不明白为什么您认为 ReadKey() 比 ReadLine() 就这个问题而言提供了优势。你是什​​么意思,“你总是在等待输入的控制台。”?
    • @jsmith,嗯......所以你认为 OP 的问题是他不喜欢“Line”这个词? (否则“语法”是相同的)
    • @Kirk Woll 当我的回答有正当理由时,你对这个问题非常固执。来自 OP “难道没有更好看的陈述”,“更具表现力的东西”。这两句话让我觉得他正在寻找更能描述该行为的东西。当您暂停屏幕时,您并不想阅读一行。但要读一键。通常是空格键或回车键。
    • @jsmith,你或许应该考虑冷静下来。考虑一下:您刚刚声称您的解决方案没有任何优势 - 现在您说它“更好看”和“更具表现力”。
    【解决方案3】:

    这取决于上下文。如果您正在谈论运行命令行、调试代码,然后能够在控制台上查看结果,那么您有两个选择:

    1. 如果您在附加调试器的情况下运行 (f5),则必须使用 Console.ReadLine
    2. 如果您在未连接调试器的情况下运行 (ctrl + f5),它将保持打开状态...但您显然无法调试。

    我不确定为什么这是默认行为,但确实是这样 :-)

    【讨论】:

      【解决方案4】:

      我通常使用以下其中一种:

      Console.ReadKey(true); //You might want to put this in an infinite loop
      new AutoResetEvent(false).WaitOne();
      

      在 VS 中你也可以运行 (Ctrl + F5) 程序(区别于在调试中运行),它会在执行完成后添加一个系统暂停。

      我会说WaitOne,只是运行(而不是调试)程序是您的非黑客选项。

      如果你确实想调试,也许在最后的}处设置一个断点。

      【讨论】:

        【解决方案5】:

        取决于我在做什么。如果我正在做多线程工作并希望我的控制台应用程序在所有其他工作完成之前保持活动状态,我通常会做这样的事情。 (类似于 MasterMastic)

        using System;
        using System.Threading;
        
        namespace Test_Console
        {
            class Program
            {
                static EventWaitHandle EWHandle;
        
                static void Main(string[] args)
                {
                    EWHandle = new EventWaitHandle(false, EventResetMode.AutoReset);
                    Thread WorkThread = new Thread(new ThreadStart(DoStuff));
                    EWHandle.WaitOne();
                }
        
                static void DoStuff()
                {
                    Console.WriteLine("Do what you want here");
        
                    EWHandle.Set();
                }
            }
        }
        

        当然,如果您想要的话,总是只使用常规断点和其他调试工具。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-11-03
          • 1970-01-01
          • 2021-04-11
          • 1970-01-01
          • 2010-11-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多