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
相关产品推荐
相关产品推荐

