小编在编写WPF程序时,需要做一个判断:定时使用Modbus协议使用Quartz.net 定时任务读取设备中的数据,同时也使用定时任务判断是否长时间获取不到数据的情况,如果程序中超过一分钟没有获取到数据(数据没有更新),则认为已经掉线。因此在类中使用了 DateTime
类型数据记录获取数据的时间。
判断是否在线使用了当前时间减去获取数据的时间,类似于这样:
RunningTime = DateTime.MinValue;
var x = DateTime.Now - RunningTime;
var y = x.Minutes>1?"连接断开":"连接正常";
上述 x
的类型为 TimeSpan
。那么问题就从这里埋下了。
问题再现
出现问题的时间点:在不连接设备时,保持程序在运行状态,整点时间时出现的时候就会出现连接正常的状态,通过日志进行分析,发现整点时,分钟为0,与时间最小值做完运算后得到的 x.Minutes
的值就为 0
,因此出现连接正常的情况。
解决方法
通过TimeSpan的文档发现 TimeSpan
中的属性如下:
属性 | 解释 |
---|---|
Days | 获取当前 TimeSpan 结构所表示的时间间隔的天数部分。 |
Hours | 获取当前 TimeSpan 结构所表示的时间间隔的小时数部分。 |
Milliseconds | 获取当前 TimeSpan 结构所表示的时间间隔的毫秒数部分。 |
Minutes | 获取当前 TimeSpan 结构所表示的时间间隔的分钟数部分。 |
Seconds | 获取当前 TimeSpan 结构所表示的时间间隔的秒数部分。 |
Ticks | 获取表示当前 TimeSpan 结构的值的刻度数。 |
TotalDays | 获取以整天数和天的小数部分表示的当前 TimeSpan 结构的值。 |
TotalHours | 获取以整小时数和小时的小数部分表示的当前 TimeSpan 结构的值。 |
TotalMilliseconds | 获取以整毫秒数和毫秒的小数部分表示的当前 TimeSpan 结构的值。 |
TotalMinutes | 获取以整分钟数和分钟的小数部分表示的当前 TimeSpan 结构的值。 |
TotalSeconds | 获取以整秒数和秒的小数部分表示的当前 TimeSpan 结构的值。 |
通过 TimeSpan
的属性发现,按分钟比较需要使用 TotalMinutes
属性才可以。
说明
在通过时间运算方法使用 TimeSpan
作比较时,要特别注意。还有,有事没事要多看相关文档才可以。