C#如何在单线程下实现控制台当前行输入的非阻塞读取
单线程非阻塞读取控制台输入方案
核心原理
Console.ReadLine()默认是阻塞调用,会挂起线程直到收到换行输入。要实现非阻塞的单线程读取,可直接使用.NET内置的Console.KeyAvailable属性,该属性会立即返回当前是否存在未处理的用户按键,无任何阻塞开销。
实现示例
以下是完整可运行的实现代码,包含退格处理、输入回显、自定义逻辑执行的完整逻辑,全程运行在单线程内:
using System; using System.Text; class Program { private static readonly StringBuilder _inputBuffer = new StringBuilder(); static void Main() { while (true) { // 非阻塞检测是否有按键输入 if (Console.KeyAvailable) { ConsoleKeyInfo key = Console.ReadKey(intercept: true); switch (key.Key) { case ConsoleKey.Enter: // 读取到完整行 string inputLine = _inputBuffer.ToString(); _inputBuffer.Clear(); Console.WriteLine($"\n输入行内容:{inputLine}"); // 示例:输入exit即可退出程序 if (inputLine.Equals("exit", StringComparison.OrdinalIgnoreCase)) return; break; case ConsoleKey.Backspace: // 处理退格逻辑 if (_inputBuffer.Length > 0) { _inputBuffer.Remove(_inputBuffer.Length - 1, 1); Console.Write("\b \b"); } break; default: // 普通字符加入缓存并回显 _inputBuffer.Append(key.KeyChar); Console.Write(key.KeyChar); break; } } // 此处可插入其他需要运行的业务逻辑,不会被输入操作阻塞 // 可选:添加短时间休眠降低CPU占用,不影响输入响应 // System.Threading.Thread.Sleep(10); } } }
注意事项
- 轮询
Console.KeyAvailable的操作是瞬时完成的,不会阻塞线程,其他业务逻辑可以正常按顺序执行,完全符合单线程运行的要求。 - 可根据业务场景调整循环的休眠时间,10ms以内的休眠几乎不会有输入延迟感知,还能把CPU占用降到几乎为0。
内容的提问来源于stack exchange,提问作者ANormalUser
相关产品推荐
相关产品推荐

