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

C# WPF提醒程序实现指定时间倒计时功能相关问题咨询

WPF提醒管理程序倒计时功能实现方案

1. 日期时间拼接解析失败问题修复

不要直接拼接未处理的输入字符串做类型转换,按以下步骤实现可稳定得到合法DateTime对象:

  • 输入预处理:先对日期输入框、时间输入框的内容调用Trim()清除首尾多余空格,避免因为用户误输入空格导致格式匹配失败。
  • 前置校验:拼接前先分别校验日期、时间的格式合法性,校验不通过直接弹出格式提示,阻断后续流程。
  • 固定格式解析:拼接时在日期、时间字符串中间补半角空格,使用DateTime.TryParseExact方法指定固定格式、忽略系统区域差异做解析,避免因为本地时间格式设置不同导致转换报错。

参考实现代码:

string dateRaw = dateTextBox.Text.Trim();
string timeRaw = timeTextBox.Text.Trim();
string parseTarget = $"{dateRaw} {timeRaw}";

// 严格按指定格式解析
bool parseSuccess = DateTime.TryParseExact(
    parseTarget,
    "dd.MM.yyyy HH:mm:ss",
    System.Globalization.CultureInfo.InvariantCulture,
    System.Globalization.DateTimeStyles.None,
    out DateTime countdownTarget
);

if (!parseSuccess)
{
    MessageBox.Show("时间格式错误,请按dd.MM.yyyy填日期、HH:mm:ss填时间");
    return;
}
if (countdownTarget <= DateTime.Now)
{
    MessageBox.Show("倒计时时间不能早于当前时间");
    return;
}
// 解析得到的countdownTarget即为合法的目标时间

2. 多倒计时条目性能优化方案

严禁为每个提醒条目单独创建计时器,条目量大时大量独立计时器会导致线程占用过高、UI卡顿,采用单全局计时器+批量计算的方案即可完全规避性能问题:

  • 全局只初始化1个DispatcherTimer,触发间隔设为1秒(倒计时最小展示单位为秒,无需更高频率),窗口加载时创建一次即可,随条目新增重复使用。
  • 扩展提醒条目数据模型,新增3个属性:
    • DateTime TargetCountdownTime:存储解析得到的倒计时目标时间
    • bool EnableCountdown:标记该条目是否开启倒计时
    • string RemainingTimeDisplay:存储要展示的剩余时间文本,所有属性实现属性变更通知,直接绑定到界面对应的展示控件。
  • 计时器每秒触发的Tick事件中,仅获取1次当前时间,遍历所有满足「开启倒计时、未结案、未结束」条件的条目,统一计算时间差:
    • 剩余时间大于0时,格式化为X天 X时 X分 X秒的字符串赋值给展示属性
    • 剩余时间小于等于0时,展示文本改为「倒计时已结束」,可触发提醒音效/弹窗,标记该条倒计时完成
  • 额外优化:当列表中没有任何生效中的倒计时条目时,暂停全局计时器,新增倒计时条目时再重新启动,进一步降低资源占用。

注意:计时器回调逻辑中不要执行数据库读写、文件操作等耗时逻辑,所有时间计算全部在内存中完成,需要持久化状态时单独触发异步操作,避免阻塞UI线程。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 06:24:24