[控制台应用程序]C# - 如何“强制退出”一法
我想有一个计时器,(Thread.sleep代码)的一种方法和运行沿侧是另一种方法,等待着用户的响应。如果在用户可以响应之前计时器用完(ReadKey),那么他们将失去生命。
简而言之,我如何在计时器上有一个ReadKey?
[控制台应用程序]C# - 如何“强制退出”一法
我想有一个计时器,(Thread.sleep代码)的一种方法和运行沿侧是另一种方法,等待着用户的响应。如果在用户可以响应之前计时器用完(ReadKey),那么他们将失去生命。
简而言之,我如何在计时器上有一个ReadKey?
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
}
如果沿着这条路线走下去(并且需要任何准确的时间),确保记录自倒计时开始以来的实际时间,而不是依赖睡眠间隔的倍数。 – SoftMemes
你能展示一个示例代码吗? –
您可以短时间休息,但使用DateTime.Now的毫秒(减去在进入循环之前保存的原始值)以查看总的经过时间。 –
您可以创建一个共享的ManualResetEvent,启动一个新的线程(或使用线程池),并使用.WaitOne()方法与第二线程超时。在ReadKey()返回之后,您发出事件的信号,另一个线程将知道是否由于按下了键或者由于超时而被唤醒,并且可以做出相应的反应。
问题是,当发生超时时,'ReadKey()'_doesn't_不会返回。 –
@亨克的确 - 但程序逻辑仍然可以在其他线程上继续。 ReadKey()还没有返回,还是lanVal仍然想要读键? – SoftMemes
类似的问题http://stackoverflow.com/questions/57615/how-to-add-a-timeout-to-console-readline – Joe
你使用的是.NET 4.0吗? –
...或C#5.0 CTP - 新的异步功能将非常适合。 – mdm