定时器DispatcherTimer 和Timer 的区别(实际项目问题解决)

问题现象

好记性不如烂笔头,这里记录下开发自动机程序与扫描枪时出现的问题,以便日后查看。

实现什么功能

程序与PLC通讯,获知到达指定位置后,通知开启扫描枪,扫描的二维码和捆包信息关联录入系统。

涉及三个对象

  1. 定时器
  2. 扫描枪的接受事件
  3. UI线程

实现思路:

定时器不断轮询获取相应地址值,获取到地址值后,关闭定时器,然后处理地址值,如果收到到达指定信号,通知扫描枪扫描。有个UI的字段会获取显示该二维码,该定时器线程会死循环获取该字段,超时则会跳出,该字段有值则会录入系统。

具体出现的问题

最开始使用的是 System.Windows.Threading.DispatcherTimer 的定时器,出现了扫描枪成功扫描到,但循环检测字段却一直是空,直到超时退出定时器的事件后才成功获取到值。

解决方法

后面定时器改用了 System.Timers.Timer 后,就可以成功读取到字段值了,也不会造成界面卡顿。

总结

System.Windows.Threading.DispatcherTimer 定时器其实是在UI主线程跑的,在里面执行死循环检测,会使界面卡顿,并且不能更新界面的字段。而
System.Timers.Timer 则是另外一个线程跑,不会发生上面的情况。

原文地址:https://www.cnblogs.com/peijia/p/14365836.html