C#控制台倒计时器:如何实现自定义时长及启动暂停控制功能
C# 控制台倒计时器启动/暂停功能实现方案
核心调整逻辑
- 新增
isStarted、isPaused两个布尔状态变量,分别控制倒计时的启动状态、暂停状态 - 替换原有的整秒阻塞休眠逻辑,改用短间隔休眠+
Console.KeyAvailable非阻塞检测按键,保证操作响应即时性 - 时间输入完成后优先展示操作指引,等待用户触发启动操作后再开始倒计时
修改后完整可运行代码
using System; namespace time_console { class Program { static void Main(string[] args) { designNumbers Fancy = new designNumbers(); Program mainMenu = new Program(); mainMenu.RunMainMenu(); } private void RunMainMenu() { string prompt = "欢迎使用Neil倒计时器,请选择操作选项"; string[] options = { "设置时间", "退出" }; Menu mainMenu = new Menu(prompt, options); int selectedIndex = mainMenu.Run(); switch (selectedIndex) { case 0: SetTime(); break; case 1: Exit(); break; } } private void SetTime() { Console.SetCursorPosition(4, 4); Console.WriteLine("请输入时间,分别输入分钟和秒数"); Console.SetCursorPosition(4, 5); int m = Convert.ToInt32(Console.ReadLine()); Console.SetCursorPosition(4, 6); int s = Convert.ToInt32(Console.ReadLine()); // 新增状态变量 bool isStarted = false; bool isPaused = false; int timeCounter = 0; Console.Clear(); Console.SetCursorPosition(4, 4); Console.WriteLine("操作指引:按S键开始/继续倒计时,按P键暂停倒计时,按M键返回主菜单"); for (; ; ) { // 非阻塞检测按键输入 if (Console.KeyAvailable) { ConsoleKeyInfo key = Console.ReadKey(true); switch (key.Key) { case ConsoleKey.S: if (!isStarted) { isStarted = true; } else if (isPaused) { isPaused = false; } break; case ConsoleKey.P: if (isStarted && !isPaused) { isPaused = true; } break; case ConsoleKey.M: Console.Clear(); RunMainMenu(); return; } } // 未启动或暂停状态下不处理时间 if (!isStarted || isPaused) { System.Threading.Thread.Sleep(100); continue; } // 倒计时逻辑 if (s == 0 && m == 0) { Console.SetCursorPosition(4, 7); Console.WriteLine("\n时间到!"); break; } if (timeCounter >= 10) { timeCounter = 0; if (s == 0) { s = 60; m--; } s--; } Console.SetCursorPosition(4, 6); Console.WriteLine($"{m:D2}:{s:D2} "); // 加空格覆盖残留字符 System.Threading.Thread.Sleep(100); timeCounter++; } Console.SetCursorPosition(4, 8); Console.WriteLine("按M键返回主菜单"); ConsoleKeyInfo backKey = Console.ReadKey(true); if(backKey.Key == ConsoleKey.M) { Console.Clear(); RunMainMenu(); } } private void Exit() { Console.WriteLine("按任意键退出..."); Console.ReadKey(true); Environment.Exit(0); } } }
关键逻辑说明
- 时间格式化用
$"{m:D2}:{s:D2}"保证显示始终是两位数字,避免出现1:5这类格式问题 - 每次循环间隔100ms,累计10次即1秒后再更新时间,既保证计时准确,又能保证按键操作100ms内就能响应
- 非阻塞按键检测不会打断倒计时流程,暂停状态下时间不会继续递减
内容的提问来源于stack exchange,提问作者Neil0823
相关产品推荐
相关产品推荐

