问题现象
好记性不如烂笔头,这里记录下开发自动机程序与扫描枪时出现的问题,以便日后查看。
实现什么功能
程序与PLC通讯,获知到达指定位置后,通知开启扫描枪,扫描的二维码和捆包信息关联录入系统。
涉及三个对象
- 定时器
- 扫描枪的接受事件
- UI线程
实现思路:
定时器不断轮询获取相应地址值,获取到地址值后,关闭定时器,然后处理地址值,如果收到到达指定信号,通知扫描枪扫描。有个UI的字段会获取显示该二维码,该定时器线程会死循环获取该字段,超时则会跳出,该字段有值则会录入系统。
具体出现的问题
最开始使用的是 System.Windows.Threading.DispatcherTimer 的定时器,出现了扫描枪成功扫描到,但循环检测字段却一直是空,直到超时退出定时器的事件后才成功获取到值。
解决方法
后面定时器改用了 System.Timers.Timer 后,就可以成功读取到字段值了,也不会造成界面卡顿。
总结
System.Windows.Threading.DispatcherTimer 定时器其实是在UI主线程跑的,在里面执行死循环检测,会使界面卡顿,并且不能更新界面的字段。而
System.Timers.Timer 则是另外一个线程跑,不会发生上面的情况。