Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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#_Multithreading_Methods_Timer - Fatal编程技术网

C#-如何;“强制退出”;方法

C#-如何;“强制退出”;方法,c#,multithreading,methods,timer,C#,Multithreading,Methods,Timer,[控制台应用程序] 我希望在计时器上有一个方法,(Thread.Sleep),并在它旁边运行另一个方法,等待用户的响应。如果计时器在用户响应(ReadKey)之前用完,那么他们将失去生命 简而言之,我怎样才能让ReadKey位于计时器上?控制台。ReadKey()正在阻塞,因此您无法使用它 您可以使用Console.KeyAvailable()和Thread.Sleep()循环。不需要定时器 var lastKeyTime = DateTime.Now; ... while (true) {

[控制台应用程序]

我希望在计时器上有一个方法,(Thread.Sleep),并在它旁边运行另一个方法,等待用户的响应。如果计时器在用户响应(ReadKey)之前用完,那么他们将失去生命

简而言之,我怎样才能让ReadKey位于计时器上?

控制台。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仍希望读取密钥。。?