小编在编写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作比较时,要特别注意。 还有,有事没事要多看相关文档才可以。
