System.Threading.Timer自行停止问题排查与解决方案咨询
定时器自行停止问题排查与解决方案
我们有一个维护字典和System.Threading.Timer的类,通过定时器回调定期刷新字典,该方案已稳定运行多年,但近期出现定时器自行停止的情况。由于之前日志缺失且回调未加try-catch(现已补充),暂未明确根因。
怀疑的潜在原因
- 内存资源不足:该刷新逻辑属于内存占用极高的大型应用(任务管理器显示占用94-95%内存),当内存占用达到97-99%时,系统可能无法为回调分配ThreadPool线程,导致定时器任务无法执行。
- 回调堆叠问题:如果
RefreshTheDictionaryMagicMethod()的执行时间超过1分钟的刷新间隔,定时器再次触发时会如何处理?
补充疑问
已为Callback添加try-catch块,想明确两个问题:
- 定时器内部错误或深层函数抛出的异常是否会暴露到回调方法中?
- 捕获异常后是否可以重建定时器恢复功能?
代码示例
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
相关产品推荐
相关产品推荐

