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

C# Threading.Timer 如何捕获倒计时Tick事件获取剩余秒数

实现方案

你可以通过调整定时器触发间隔、新增剩余秒数字段的方式实现倒计时效果,具体实现代码如下:

步骤1:新增必要字段

// 存储倒计时剩余秒数
private int _remainingSeconds;
// 定时器实例
private Timer _timerObj;

步骤2:调整定时器初始化逻辑

把原来的单次触发逻辑改为每秒触发一次,初始化倒计时总时长为30秒:

// 初始化倒计时总时长30秒
_remainingSeconds = 30;
_timerObj = new Timer(CountDownHandler, null, Timeout.Infinite, Timeout.Infinite);
// 配置1秒后第一次触发,之后每1秒触发一次
_timerObj.Change(1000, 1000);

步骤3:新增每秒触发的回调处理逻辑

private void CountDownHandler(object state)
{
    _remainingSeconds--;
    
    // 此处更新UI展示剩余秒数,注意:Timer回调运行在后台线程,操作UI需要调度到UI线程
    // Winform 示例:
    // this.Invoke(new Action(() => 
    // {
    //     lblCountDown.Text = $"剩余{_remainingSeconds}秒";
    // }));
    // WPF 示例:
    // Dispatcher.Invoke(() => 
    // {
    //     CountDownTip = $"剩余{_remainingSeconds}秒";
    // });

    // 倒计时结束后执行原有逻辑并释放定时器
    if (_remainingSeconds <= 0)
    {
        _timerObj.Change(Timeout.Infinite, Timeout.Infinite);
        _timerObj.Dispose();
        UpdateUI(state);
    }
}

保留原有业务逻辑

你的原有UpdateUI方法不需要修改:

public void UpdateUI(object state)
{
    ShowQR= false;
}

注意事项

  • Threading.Timer的回调运行在线程池后台线程,直接操作UI控件会抛出跨线程异常,必须通过对应UI框架的调度器把UI更新逻辑封送到UI线程执行。
  • 倒计时结束后及时停止并释放定时器,避免不必要的资源占用。
  • 如果需要支持重启倒计时,直接重置_remainingSeconds为30,再调用_timerObj.Change(1000, 1000)即可重新开始倒计时。

内容的提问来源于stack exchange,提问作者Arvind Chourasiya

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 13:36:09