C#-如何;“强制退出”;方法
[控制台应用程序] 我希望在计时器上有一个方法,(Thread.Sleep),并在它旁边运行另一个方法,等待用户的响应。如果计时器在用户响应(ReadKey)之前用完,那么他们将失去生命 简而言之,我怎样才能让ReadKey位于计时器上?C#-如何;“强制退出”;方法,c#,multithreading,methods,timer,C#,Multithreading,Methods,Timer,[控制台应用程序] 我希望在计时器上有一个方法,(Thread.Sleep),并在它旁边运行另一个方法,等待用户的响应。如果计时器在用户响应(ReadKey)之前用完,那么他们将失去生命 简而言之,我怎样才能让ReadKey位于计时器上?控制台。ReadKey()正在阻塞,因此您无法使用它 您可以使用Console.KeyAvailable()和Thread.Sleep()循环。不需要定时器 var lastKeyTime = DateTime.Now; ... while (true) {
控制台。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
}
您可以创建一个共享的ManualResetEvent,启动一个新线程(或使用线程池),并在第二个线程上使用带有超时的.WaitOne()方法。ReadKey()返回后,您向事件发送信号,另一个线程将知道它是否因为按下某个键或超时而被唤醒,并可以做出相应的反应。类似的问题。。。或者C#5.0 CTP-新的异步功能将是一个很好的选择。@mdm,我不认为新的异步功能在这里对您有多大帮助。如果您走这条路(并且需要任何类型的精确计时),确保跟踪倒计时开始后的实际时间,而不是依赖睡眠间隔的倍数。您可以短时间睡眠,但使用DateTime。现在是毫秒(减去进入循环前保存的原始值)以查看总运行时间。好的,这让我走上了正确的轨道,我想我的想法比你的例子简单一点。谢谢你的帮助。关键是当超时发生时,
ReadKey()
不会返回。@Henk,的确如此-但是程序逻辑仍然可以在另一个线程上继续。ReadKey()尚未返回是一个问题,还是lanVal仍希望读取密钥。。?