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

System.Threading.Timer自行停止问题排查与解决方案咨询

定时器自行停止问题排查与解决方案

我们有一个维护字典和System.Threading.Timer的类,通过定时器回调定期刷新字典,该方案已稳定运行多年,但近期出现定时器自行停止的情况。由于之前日志缺失且回调未加try-catch(现已补充),暂未明确根因。

怀疑的潜在原因

  • 内存资源不足:该刷新逻辑属于内存占用极高的大型应用(任务管理器显示占用94-95%内存),当内存占用达到97-99%时,系统可能无法为回调分配ThreadPool线程,导致定时器任务无法执行。
  • 回调堆叠问题:如果RefreshTheDictionaryMagicMethod()的执行时间超过1分钟的刷新间隔,定时器再次触发时会如何处理?

补充疑问

已为Callback添加try-catch块,想明确两个问题:

  1. 定时器内部错误或深层函数抛出的异常是否会暴露到回调方法中?
  2. 捕获异常后是否可以重建定时器恢复功能?

代码示例

public class RefreshDict : IDisposable
{
    public Timer myTimer;
    public Dictionary<string, string> myDict;

    public RefreshDict()
    {
    }

    public void SetCallback()
    {
        myTimer = new Timer(Callback, null, TimeSpan.FromMinutes(1),
            Timeout.InfiniteTimeSpan);
    }

    public void Dispose()
    {
        if (myTimer != null) 
        {
            myTimer.Dispose();
        }
    }

    public void Callback(object state)
    {
        RefreshTheDictionaryMagicMethod();
        myTimer.Change(TimeSpan.FromMinutes(1));
    }

    public void RefreshTheDictionaryMagicMethod()
    {
        // some query to a db and some updating a myDict object with new values
    }
}

后续更新与经验总结

问题已解决,根因是字典数据拉取逻辑首次拉取返回null且无日志记录,导致程序静默停滞。
总结经验:

  • 必须完善关键逻辑的参数校验,避免空值等异常情况引发静默故障;
  • 全面补充日志记录,尤其是核心业务逻辑的输入输出、异常信息,便于快速排查问题;
  • 排查问题时需谨慎参考经验性建议,优先基于实际日志和代码逻辑定位根因。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 23:10:07