Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 控制台读取键超时_C# - Fatal编程技术网

C# 控制台读取键超时

C# 控制台读取键超时,c#,C#,我已经构建了一个简单的控制台应用程序,我需要给用户一个特定的时间来输入keychar 我应该用这个吗 System.Threading.Thread.Sleep(1000); 对于那些不理解的人,我需要程序跳过Console.ReadKey().KeyChar在x秒之后 这可能吗?问题:如果使用Thread.Sleep()等待1秒,它将在给定的时间段内挂起主线程 解决方案:您可以使用System.Timers.Timer等待给定的时间量 试试这个: System.Timers.Time

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

我应该用这个吗

System.Threading.Thread.Sleep(1000);
对于那些不理解的人,我需要程序跳过
Console.ReadKey().KeyChar
x
秒之后


这可能吗?

问题:如果使用
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();
    }

我会这样做:

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);
DateTime beginWait=DateTime.Now;
while(!Console.KeyAvailable&&DateTime.Now.Subtract(beginWait).TotalSeconds<5)
睡眠(250);
如果(!Console.KeyAvailable)
控制台。WriteLine(“你什么都没按!”);
其他的
WriteLine(“您按下:{0}”,Console.ReadKey().KeyChar);

使用计时器。睡眠会冻结你的gui。这个答案可能是你需要的@OndrejJanacek什么是控制台GUI?@Tony“main loop”显然被标记为与突出显示的问题不重复,尽管它是相关的,并且有些答案实际上是针对这个问题的。我了解到Console.ReadKey和Console.ReadLine在所有场景中的功能差异太大,不适合单一解决方案,因此需要区分将冻结它对我很有效!是的,因为250毫秒明显少于1秒,但gui还是一样freeze@Grundy这就是为什么我使用它的价值。所以我相信它解决了这个问题。这真的很有帮助。我所做的唯一更改是使用System.Diagnostics.Stopwatch而不是DateTime。现在,它让我跳过了子部分。这不是OP需要的,在您的解决方案中,您可以定期调用
Console.ReadKey()
,但OP希望跳过Console.ReadKey().KeyChar;x之后seconds@Grundy:这不是精确的解决方案,因为OP刚才问
我应该使用它吗?Thread.Sleep()
它回答了我的问题。如果他展示了他的代码,我会提供确切的解决方案。OP问他如何使用它来解决具体问题,但在你的回答中有其他的东西