如何在指定时间启动线程?程序启动数秒后自动关闭问题如何解决
问题修复方案
1 程序启动立即崩溃的直接问题
你的setUpTimer方法第一行存在无终止条件的自调用,会触发无限递归导致栈溢出,程序直接崩溃退出。
- 修复方法:直接删除
setUpTimer(new TimeSpan(21, 27, 0));这行多余的递归代码即可。
2 程序初始化后数秒自动关闭的核心问题
System.Threading.Timer属于后台线程,后台线程不会阻止宿主进程退出。如果你的程序是控制台等类型,主线程执行完初始化逻辑后没有阻塞逻辑,会直接结束进程,定时任务根本来不及触发。
- 修复方法:在程序入口主线程末尾添加阻塞逻辑,示例如下:
// 全局定义阻塞事件 private static ManualResetEvent _exitBlocker = new ManualResetEvent(false); // 主线程所有初始化逻辑完成后添加 _exitBlocker.WaitOne();
如果是控制台程序也可以直接用Console.ReadLine()做简单阻塞。
3 定时逻辑优化
3.1 跨天定时兼容
当前逻辑如果运行时已经过了早上6:40,timeToGo会小于0,直接return不会创建定时器,当天的任务不会执行。需要增加跨天逻辑:
TimeSpan timeToGo = alertTime - current.TimeOfDay; if (timeToGo < TimeSpan.Zero) { // 当天时间已过,定时到次日同一时间 timeToGo += TimeSpan.FromDays(1); }
3.2 定时时间设置
初始化定时器时传入new TimeSpan(6, 40, 0)即可实现早上6:40触发的需求,不要硬编码21:27的时间参数。
4 Selenium执行逻辑修复
你的XPath写法存在语法错误,//[@id='btnConfirm2']缺少元素匹配规则,会抛出元素找不到的异常,修改为//*[@id='btnConfirm2']即可匹配任意id为btnConfirm2的元素。
另外建议把Thread.Sleep(3000)替换为Selenium显式等待,避免网络波动导致元素未加载就执行点击,提升运行稳定性。
内容的提问来源于stack exchange,提问作者Firefox9067
相关产品推荐
相关产品推荐

