C#如何实现持续运行while循环直到用户按下按键终止?
实现方案
核心逻辑是将数据生成的耗时循环放到独立后台线程运行,主线程仅负责非阻塞监听用户按键,两者完全并行互不干扰,同时做并发控制避免共享数据读写冲突。
完整可运行代码
using System; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; class Program { // 共享数据存储对象 private static List<int> _dataList = new List<int>(); // 并发锁,保证多线程读写安全 private static object _lockObj = new object(); // 程序退出标记 private static bool _isRunning = true; static void Main(string[] args) { // 启动后台数据生成任务 Task.Run(GenerateDataLoop); Console.WriteLine("程序运行中:按任意键查看已生成数据,按q键退出程序"); // 主线程监听用户输入 while (_isRunning) { // 非阻塞检测是否有按键输入,不会暂停等待 if (Console.KeyAvailable) { var key = Console.ReadKey(true); if (key.Key == ConsoleKey.Q) { _isRunning = false; Console.WriteLine("正在停止程序..."); break; } // 加锁读取数据输出 lock (_lockObj) { Console.WriteLine($"\n当前已生成{_dataList.Count}条数据,列表如下:"); foreach (var item in _dataList) { Console.WriteLine(item); } Console.WriteLine("------------------------"); } } // 避免主线程空转占用过高CPU Thread.Sleep(100); } } // 后台数据生成循环 private static void GenerateDataLoop() { int count = 0; while (_isRunning) { count++; // 加锁写入数据 lock (_lockObj) { _dataList.Add(count); } // 间隔2秒生成一次 Thread.Sleep(2000); } } }
关键特性说明
- 后台生成逻辑全程不受输入操作影响,严格按照2秒一次的频率持续运行,不会出现中断、延迟
- 按键监听为非阻塞逻辑,不会在循环中强制等待用户输入,用户随时按键都能立即响应
- 加锁机制保证了读写操作不会并发冲突,避免List出现数据损坏、遍历异常等问题
- 支持随时查看数据,也支持正常安全退出程序
内容的提问来源于stack exchange,提问作者anchi
相关产品推荐
相关产品推荐

