在一个 Timer 时钟的周期方法内,有一个 foreach
循环,当执行到某些特定的语句时,会从头开始执行,而不会执行后续的语句。this
该问题我在初步分析以后,发现多是因为程序出现了异常,可是被吞噬掉形成的。在我某一个 item 元素当中,其值为 null
应该会抛出空异常。可是没有异常抛出,后续我不知道哪一个地方吞噬了异常,就在循环体内增长了一个 if
语句过滤掉了 null
元素。线程
不过以后仍然会出现最开始所说的问题,看来还有其余的地方在抛出异常,最后排查到是执行 DevExpress 图表控件的 BeginDataUpdate()
和 EndDataUpdate()
以后就会出现上述症状。3d
查阅了个人 Timer
是参照 ABP 实现的一个 Timer
,找到调用回调方法的地方,发现是我本身将异常捕获并将其忽略掉了。日志
private void TimerCallBack(object state) { lock (_taskTimer) { if (!_running || _performingTasks) { return; } _taskTimer.Change(Timeout.Infinite, Timeout.Infinite); _performingTasks = true; } try { Elapsed?.Invoke(this, new EventArgs()); } catch { // ignored } finally { lock (_taskTimer) { _performingTasks = false; if (_running) { _taskTimer.Change(Period, Timeout.Infinite); } Monitor.Pulse(_taskTimer); } } }
根据上图来看,确实是我回调方法中的代码抛出了异常,致使后台任务从新执行。code
将跨线程访问语句修复以后,程序运行正常,后面我也在 catch 语句块里面增长了异常日志写入,成功解决问题。orm