做了一个服务,需要5分钟执行一次,但是只执行了4次(每隔5分钟),日志就没有了。问一下这是怎么回事呢?
试了好几次,有时候是只运行5次,总之运行一段时间Timer就会停止,而查看服务本身还在运行
试了好几次,有时候是只运行5次,总之运行一段时间Timer就会停止,而查看服务本身还在运行
protected override void OnStart(string[] args) { log.Info("服务启动..."); try { Thread t1 = new Thread(new ThreadStart(RunThread)); t1.Start(); } catch (Exception ex) { log.Error(ex.Message); } } public void RunThread() { //立即执行定时器,每隔5分钟执行一次 System.Threading.Timer t = new System.Threading.Timer(new TimerCallback(GetTsLocation), null,0, 1000 * 60 * 5); } public void GetTsLocation(object obj) { log.Info("正在运行.."); }
下面是日志
Date:2016-07-02 17:58:49,194 thread:6 Level:INFO Class:TgldHcwcService.ServiceTgld File: Line:0 Message:服务启动... Date:2016-07-02 17:58:49,319 thread:7 Level:INFO Class:TgldHcwcService.ServiceTgld File: Line:0 Message:正在运行.. Date:2016-07-02 18:03:49,308 thread:13 Level:INFO Class:TgldHcwcService.ServiceTgld File: Line:0 Message:正在运行.. Date:2016-07-02 18:08:49,312 thread:27 Level:INFO Class:TgldHcwcService.ServiceTgld File: Line:0 Message:正在运行.. Date:2016-07-02 18:13:49,316 thread:37 Level:INFO Class:TgldHcwcService.ServiceTgld File: Line:0 Message:正在运行..
解决方案
10
至少,你要把变量 t 声明在方法外边。
假如 log.Info(“正在运行..”) 执行之前恰好进行了一次比较深度的内存清理,那么你的 Timer 对象就销毁了。
假如 log.Info(“正在运行..”) 执行之前恰好进行了一次比较深度的内存清理,那么你的 Timer 对象就销毁了。
10
同意sp1234的观点,把t作为成员变量看看。