马上加入IBC程序猿 各种源码随意下,各种教程随便看! 注册 每日签到 加入编程讨论群

C#教程 ASP.NET教程 C#视频教程程序源码享受不尽 C#技术求助 ASP.NET技术求助

【源码下载】 社群合作 申请版主 程序开发 【远程协助】 每天乐一乐 每日签到 【承接外包项目】 面试-葵花宝典下载

官方一群:

官方二群:

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

[复制链接]
查看1924 | 回复0 | 2019-9-26 09:16:29 | 显示全部楼层 |阅读模式

题目

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

  阅读代码后,发现代码中有及时上传数据的逻辑,但是运行一段时间后,中控zkemkeeper SDK中的变乱失效,导致员工打卡数据没有及时上传。

缘故因由

  查察中控SDK Demo中的示例代码,发实际现逻辑是一样的。唯一不同的是demo利用的是winform项目编写,打卡机同步项目是用windows服务项目编写的。

  发现中控考勤机 zkemkeeper SDK是COM组件封装,这和winform窗体控件是一样的,基于消息循环机制。比方:winfrom项目当中 main函数都如许启动主窗体 Application.Run(new form1());

092029issmsguym6g767bs.png

  也就是说当你实现sdk类的时间,不在线程中进行消息循环,就有大概导致变乱失效。

解决方式

  定位了大概导致题目的缘故因由,我对考勤机数据获取类进行如下改动:

  1. 为了简朴将连接连接打卡机装备和触发打卡的方法直接移动到一个form当中去

  1. FrmEquipment frmEquipment = new FrmEquipment();//form窗体中实现打卡机数据触发变乱逻辑
复制代码

  2. 在启动打卡机连接的线程中声明为 STAThread

  1. Thread equipmentThread = new Thread(StartEquipmentForm);
  2. equipmentThread.IsBackground = true;
  3. equipmentThread.SetApartmentState(ApartmentState.STA);
  4. equipmentThread.Start();<br /><br />
复制代码

///


/// 启动装备连接from
///

[STAThread]
private void StartEquipmentForm()
{
  Application.Run(frmEquipment);

}

  3. 关闭数据集成服务时 跨线程 利用 form.Invoke 关照窗体关闭连接

  1. frmEquipment.Invoke(new Action(() =>
  2. {
  3. frmEquipment.Close();
  4. }));
复制代码

  

  经过几天测试根本运行稳固,根本确定打卡机变乱触发失效是由于原服务,没有对COM组件运行于单线程【STA】单位消息循环造成的。







来源:https://www.cnblogs.com/magicbowie/archive/2019/09/25/11585591.html
C#论坛 www.ibcibc.com IBC编程社区
C#
C#论坛
IBC编程社区
*滑块验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则