【问题标题】:Console ReadKey timeout [duplicate]控制台读取密钥超时 [重复]
【发布时间】:2026-01-05 12:25:01
【问题描述】:

我已经构建了一个简单的控制台应用程序,我需要给用户一个特定的时间来输入一个 keychar。

我应该使用这个吗?

System.Threading.Thread.Sleep(1000);

对于那些不明白的人,我需要程序在x秒后跳过Console.ReadKey().KeyChar;

这可能吗?

【问题讨论】:

  • 使用计时器。睡眠会冻结你的 gui。
  • 这个答案可能是你所需要的。 . . *.com/a/57655/18797
  • @OndrejJanacek 什么是控制台 GUI?
  • @Tony“主循环”显然是我认为
  • 标记为不是突出显示的问题的副本,尽管是相关的,并且其中一些答案实际上是针对这个问题的。我搜索了这个问题,了解到 Console.ReadKey 和 Console.ReadLine 在所有场景中对于单一解决方案在功能上的差异太大,因此需要区分。

标签: c#


【解决方案1】:

我会这样做:

DateTime beginWait = DateTime.Now;
while (!Console.KeyAvailable && DateTime.Now.Subtract(beginWait).TotalSeconds < 5)
    Thread.Sleep(250);

if (!Console.KeyAvailable)
    Console.WriteLine("You didn't press anything!");
else
    Console.WriteLine("You pressed: {0}", Console.ReadKey().KeyChar);

【讨论】:

  • 如@OndrejJanacek Thread.Sleep(250); 所说,将冻结gui
  • 它对我很有效!
  • 是的,因为 250 毫秒明显少于 1 秒,但 gui 都一样冻结
  • @Grundy 这就是为什么我使用它的价值。所以我相信它可以解决这种情况下的问题。
  • 这真的很有帮助。我所做的唯一更改是使用 System.Diagnostics.Stopwatch 而不是 DateTime.Now,这样我就可以跳过减法
【解决方案2】:

问题:如果您使用 Thread.Sleep() 等待 1 秒,它会在给定的时间段内挂起主线程。

解决方案:您可以使用System.Timers.Timer 等待给定的时间。

试试这个:

    System.Timers.Timer timer1 = new System.Timers.Timer();
    timer1.Interval=1000;//one second
    timer1.Elapsed += new System.Timers.ElapsedEventHandler(timer1_Tick);
    timer1.Start();
    char ch;
    private void timer1_Tick(object sender, System.Timers.ElapsedEventArgs e)
    {
        ch=Console.ReadKey().KeyChar;
        //stop the timer whenever needed
        //timer1.Stop();
    }

【讨论】:

  • 这不是 OP 需要的,在您的解决方案中,您定期调用 Console.ReadKey(),但 OP 想要 skip Console.ReadKey().KeyChar; x 秒后
  • @Grundy:这不是确切的解决方案,因为 OP 刚刚问过Should I use this? Thread.Sleep(),它回答了 IMO 的问题。如果他展示了他的代码,我会提供确切的解决方案。
  • OP 询问是否将其用于解决具体问题,但在您的回答中有其他内容