在多线程类循环中实现每分钟任务,是否用System.Timers.Timer?
使用System.Timers.Timer完全可行,不过你的现有代码存在严重问题,得调整一下
- 你当前的while循环会疯狂创建新Timer实例,如果
computerUptimeCommandInMinutes值在循环内没更新,这个循环会无限跑下去,瞬间生成大量Timer,直接导致资源泄漏,完全不符合需求。 - 正确的逻辑应该是:初始化一个Timer,设置首次触发延迟1分钟,之后每分钟触发一次;每次触发时检查系统运行时间是否超过15分钟,超过就停止Timer,避免继续执行。
修正后的代码示例:
// 定义静态Timer实例,避免重复创建造成资源浪费 private static System.Timers.Timer _checkTimer; static public void Initializer() { // 你的其他多线程初始化代码... int initialDelay = 60 * 1000; // 首次触发延迟1分钟 int normalInterval = 60 * 1000; // 后续每分钟触发一次 _checkTimer = new System.Timers.Timer(); _checkTimer.Elapsed += OnTimedEvent; // 一次性设置首次延迟和后续间隔,更简洁 _checkTimer.Change(initialDelay, normalInterval); } private static void OnTimedEvent(object source, ElapsedEventArgs e) { // 先检查系统运行时间是否已达15分钟上限,到点就停掉Timer if (computerUptimeCommandInMinutes >= 15) { _checkTimer.Stop(); _checkTimer.Dispose(); return; } // 执行检查方法,注意该方法可能触发应用重启 myMethod(); }
额外注意事项:
- 确保
computerUptimeCommandInMinutes的更新是线程安全的,比如用volatile修饰变量,或者在读写时加锁,避免多线程场景下的数值不一致。 - System.Timers.Timer的
Elapsed事件是在ThreadPool线程中触发的,不会阻塞你的Initializer方法里的其他线程,完美适配你不能用Sleep的场景。 - 因为
myMethod可能导致应用重启,所以即便没手动停止Timer,重启后所有资源都会重置,无需额外担心残留问题。
内容的提问来源于stack exchange,提问作者Yuki1112
相关产品推荐
相关产品推荐

