C#控制台应用如何在运行时通过控制台交互读取变量值(如处理速度)
实现方案
你可以通过C#控制台的非阻塞按键检测功能实现需求,不需要打断正常的业务处理流程,也不需要中途暂停Stopwatch影响计时准确性,修改后的完整代码如下:
static void Main(string[] args) { var sw = new Stopwatch(); var worker = new Worker(); var start = DateTime.Now; Console.WriteLine($"Initialisation started at {start}"); sw.Start(); var materials = worker.GatherMaterials(); var workStart = DateTime.Now; Console.WriteLine($"Work started at {workStart}."); // 新增常驻操作提示 Console.WriteLine("提示:按下S键可随时查看当前处理速度"); var products = new List<Product>(); foreach (var material in materials) { try { // 非阻塞检测按键输入,不会打断处理流程 if (Console.KeyAvailable) { var keyInfo = Console.ReadKey(intercept: true); if (keyInfo.Key == ConsoleKey.S) { double currentSpeed = (double)products.Count / sw.Elapsed.TotalSeconds; Console.WriteLine($"[实时统计] 已处理{products.Count}个产品,当前平均速度:{currentSpeed:F2} 个/秒"); } } var product = worker.Process(material); products.Add(product); } catch (Exception ex) { Console.WriteLine(ex.Message); break; } } sw.Stop(); Console.WriteLine(); var finish = DateTime.Now; Console.WriteLine($"Work finished at {finish}"); Console.WriteLine($"Ran from {start} to {finish} for approximately {sw.Elapsed} ms."); var finalSpeed = (double)products.Count / sw.Elapsed.TotalSeconds; Console.WriteLine($"Processed {products.Count} products for an average processing speed of {finalSpeed:F2} products/s."); var jsonOptions = new JsonSerializerOptions() { Encoder = JavaScriptEncoder.Create(UnicodeRanges.All), WriteIndented = true }; var json = JsonSerializer.Serialize(products, jsonOptions); File.WriteAllText("products.json", json, Encoding.UTF8); Console.WriteLine("Saved all products to products.json"); }
核心改动说明
- 移除了原代码中Stopwatch的中途暂停、重启逻辑,全程保持运行,计时精度更高
- 新增非阻塞按键检测逻辑:通过
Console.KeyAvailable检测是否有按键输入,不会阻塞正常的物料处理流程 - 兼容大小写S键触发统计查询,设置
Console.ReadKey(intercept: true)可避免按键输入回显到控制台,不会打乱正常的日志输出 - 处理速度在触发查询时实时计算,无需额外缓存变量,数据准确性更高
如果单个物料处理耗时较长,想要按键响应更实时,可以单独开一个后台线程监听按键,和主线程的处理逻辑完全隔离,不会互相影响。
内容的提问来源于stack exchange,提问作者JansthcirlU
相关产品推荐
相关产品推荐

