You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 06:24:05