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

DispatcherTimer无法重复启动?倒计时功能仅生效一次求助

问题原因及解决方法

核心问题

你代码里的关键错误是每次Tick事件触发时,都重新从原始的blockTime创建timeSpan,而不是更新并保存剩余的倒计时时间。比如初始blockTime是15分钟,第一次Tick减到14分钟,但下次Tick又重新拿15分钟来计算,等于剩余时间根本没被持久化更新。另外你在Tick里重复调用dispatcherTimer.Start()是多余的——定时器启动后会自动按间隔触发Tick,已经处于运行状态时调用Start()不会产生任何效果,反而导致后续Tick无法正常触发。

修复步骤

  1. 定义一个类级别的TimeSpan变量,专门用来保存剩余的倒计时时间,替代每次从blockTime重新初始化的逻辑。
  2. 移除Tick事件里多余的dispatcherTimer.Start()调用,让定时器按预设间隔自动触发。
  3. 每次Tick时直接更新剩余时间变量,并同步刷新UI显示。

修正后的代码

private TimeSpan _remainingTime;
private DispatcherTimer dispatcherTimer;

private async void Window_Activated(object sender, WindowActivatedEventArgs args)
{       
  // 初始化剩余时间为设定的总时长
  _remainingTime = blockTime;
  // 避免重复创建定时器(窗口多次激活时生效)
  if (dispatcherTimer == null)
  {
    dispatcherTimer = new DispatcherTimer();
    dispatcherTimer.Tick += dispatcherTimer_Tick;
    dispatcherTimer.Interval = new TimeSpan(0,1,0);
  }
  dispatcherTimer.Start();     
}

private void dispatcherTimer_Tick(object sender, object e)
{
  if (_remainingTime > TimeSpan.Zero)
  {
    // 更新剩余时间
    _remainingTime = _remainingTime.Subtract(TimeSpan.FromMinutes(1));
    // 格式化显示,确保分钟为两位数(如0:05而非0:5)
    Countdown_TexBlock.Text = $"{_remainingTime.Hours}:{_remainingTime.Minutes:D2}";
  }     
  else
  {
    dispatcherTimer.Stop();
    // 可在此添加倒计时结束后的处理逻辑
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 20:16:12