题目
前同事编写的对中控考勤机数据集成项目当中,打卡数据不能及时进行上传到平台当中,一直靠定时全量上传来同步数据。
阅读代码后,发现代码中有及时上传数据的逻辑,但是运行一段时间后,中控zkemkeeper SDK中的变乱失效,导致员工打卡数据没有及时上传。
缘故因由
查察中控SDK Demo中的示例代码,发实际现逻辑是一样的。唯一不同的是demo利用的是winform项目编写,打卡机同步项目是用windows服务项目编写的。
发现中控考勤机 zkemkeeper SDK是COM组件封装,这和winform窗体控件是一样的,基于消息循环机制。比方:winfrom项目当中 main函数都如许启动主窗体 Application.Run(new form1());
也就是说当你实现sdk类的时间,不在线程中进行消息循环,就有大概导致变乱失效。
解决方式
定位了大概导致题目的缘故因由,我对考勤机数据获取类进行如下改动:
1. 为了简朴将连接连接打卡机装备和触发打卡的方法直接移动到一个form当中去
- FrmEquipment frmEquipment = new FrmEquipment();//form窗体中实现打卡机数据触发变乱逻辑
复制代码
2. 在启动打卡机连接的线程中声明为 STAThread
- Thread equipmentThread = new Thread(StartEquipmentForm);
- equipmentThread.IsBackground = true;
- equipmentThread.SetApartmentState(ApartmentState.STA);
- equipmentThread.Start();<br /><br />
复制代码 /// /// 启动装备连接from /// [STAThread] private void StartEquipmentForm() { Application.Run(frmEquipment);
}
3. 关闭数据集成服务时 跨线程 利用 form.Invoke 关照窗体关闭连接
- frmEquipment.Invoke(new Action(() =>
- {
- frmEquipment.Close();
- }));
复制代码
经过几天测试根本运行稳固,根本确定打卡机变乱触发失效是由于原服务,没有对COM组件运行于单线程【STA】单位消息循环造成的。
来源:https://www.cnblogs.com/magicbowie/archive/2019/09/25/11585591.html |