当前位置: 移动技术网 > IT编程>开发语言>c# > 中控考勤机使用 zkemkeeper SDK订阅考勤数据事件失效解决方式

中控考勤机使用 zkemkeeper SDK订阅考勤数据事件失效解决方式

2019年09月25日  | 移动技术网IT编程  | 我要评论
问题 前同事编写的对中控考勤机数据集成项目当中,打卡数据不能实时进行上传到平台当中,一直靠定时全量上传来同步数据。 阅读代码后,发现代码中有实时上传数据的逻辑,但是运行一段时间后,中控zkemkeeper SDK中的事件失效,导致员工打卡数据没有实时上传。 原因 查看中控SDK Demo中的示例代码 ...

 

问题

  前同事编写的对中控考勤机数据集成项目当中,打卡数据不能实时进行上传到平台当中,一直靠定时全量上传来同步数据。

  阅读代码后,发现代码中有实时上传数据的逻辑,但是运行一段时间后,中控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();

  /// <summary>
  /// 启动设备连接from
  /// </summary>
  [stathread]
  private void startequipmentform()
  {
    application.run(frmequipment);

  }

 

  3. 关闭数据集成服务时 跨线程 使用 form.invoke 通知窗体关闭连接

 

frmequipment.invoke(new action(() =>
{
     frmequipment.close();
}));

  

  经过几天测试基本运行稳定,基本确定打卡机事件触发失效是由于原服务,没有对com组件运行于单线程【sta】单元消息循环造成的。

 

如您对本文有疑问或者有任何想说的,请 点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网