C# 非阻塞监听键盘输入

  最新写一个基于控制台的小程序,想要达到用键盘控制程序的暂停和退出,即:

  定义运行标志bool RunFlag=true,退出标志bool ExitFlag=false。

  程序并不断检测键盘,如果检测到有按键且不是按下“X”键,则RunFlag=!RunFlag;如果检测是按下“X”,则ExitFalg=!ExitFlag。如果RunFlag为true则执行程序预定任务A,如果ExitFlag为true,则退出。

  键盘检测用ReadKey函数获取用户的键盘输入,但是这样会一直等待用户输入,造成程序的阻塞。如果另开一个线程检测用户输入键盘输入,在程序程序任务A循环中,键盘键盘输入的线程貌似一直挂起,按键盘没有反应。

  后来在Stackoverflow上找到了答案(Non-Blocking read from standard I/O in C# [closed]),代码如下:

   1:  while (true)  
   2:  {  
   3:      if (Console.KeyAvailable)  
   4:      {  
   5:          ConsoleKeyInfo key = Console.ReadKey(true);  
   6:          switch (key.Key)  
   7:          {  
   8:              case ConsoleKey.F1:  
   9:                  Console.WriteLine("You pressed F1!");  
  10:                  break;  
  11:              default:  
  12:                  break;  
  13:          }  
  14:      }  
  15:      // Do something more useful  
  16:  } 

 

 

MSDN(http://social.msdn.microsoft.com/Forums/en/csharpgeneral/thread/f6ceed23-36dd-49ac-96a7-9aca8f5a33b7)上也提到了解决的办法(Poll with the Console.KeyAvailable property.  When it returns True, ReadKey() won't block.先检测Console.KeyAvailable状态,如果true说明有按键,再获取键盘输入并处理,这样就不会有等待用户输入的阻塞问题了)

posted @ 2013-03-11 10:50  ijustwanttorun  阅读(4072)  评论(1编辑  收藏  举报