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

在多线程类循环中实现每分钟任务,是否用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 17:45:44