2011-07-11 100 views
2

[控制台应用程序]C# - 如何“强制退出”一法

我想有一个计时器,(Thread.sleep代码)的一种方法和运行沿侧是另一种方法,等待着用户的响应。如果在用户可以响应之前计时器用完(ReadKey),那么他们将失去生命。

简而言之,我如何在计时器上有一个ReadKey?

+1

类似的问题http://stackoverflow.com/questions/57615/how-to-add-a-timeout-to-console-readline – Joe

+0

你使用的是.NET 4.0吗? –

+0

...或C#5.0 CTP - 新的异步功能将非常适合。 – mdm

回答

5

Console.ReadKey()被阻塞,所以你不能使用它。

您可以循环使用Console.KeyAvailable()Thread.Sleep()。不需要定时器。

var lastKeyTime = DateTime.Now; 
... 
while (true) 
{ 
    if (Console.KeyAvailable()) 
    { 
     lastKeyTime = DateTime.Now; 
     // Read and process key 
    } 
    else 
    { 
     if (DateTime.Now - lastKeyTime > timeoutSpan) 
     { 
     lastKeyTime = DateTime.Now; 
     // lose a live 
     } 
    } 
    Thread.Sleep(50); // from 1..500 will work 
} 
+0

如果沿着这条路线走下去(并且需要任何准确的时间),确保记录自倒计时开始以来的实际时间,而不是依赖睡眠间隔的倍数。 – SoftMemes

+0

你能展示一个示例代码吗? –

+0

您可以短时间休息,但使用DateTime.Now的毫秒(减去在进入循环之前保存的原始值)以查看总的经过时间。 –

0

您可以创建一个共享的ManualResetEvent,启动一个新的线程(或使用线程池),并使用.WaitOne()方法与第二线程超时。在ReadKey()返回之后,您发出事件的信号,另一个线程将知道是否由于按下了键或者由于超时而被唤醒,并且可以做出相应的反应。

+1

问题是,当发生超时时,'ReadKey()'_doesn't_不会返回。 –

+0

@亨克的确 - 但程序逻辑仍然可以在其他线程上继续。 ReadKey()还没有返回,还是lanVal仍然想要读键? – SoftMemes