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说明有按键,再获取键盘输入并处理,这样就不会有等待用户输入的阻塞问题了)