问题

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

  阅读代码后,发现代码中有实时上传数据的逻辑,但是运行一段时间后,中控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】单元消息循环造成的。

中控考勤机使用 zkemkeeper SDK订阅考勤数据事件失效解决方式的更多相关文章

  1. MapReduce数据倾斜的解决方式

    数据倾斜:由于数据分布不均匀,造成数据大量的集中到一点,造成数据热点.map /reduce程序执行时,reduce节点大部分执行完毕,但是有一个或者几个reduce节点运行很慢,导致整个程序的处理时 ...

  2. Android Viewpager加Fragment做界面切换时数据消失的解决方式

    今天遇到多个Fragment切换,回来后页面空白的情况,找到这个博客方法设置了一下,就可以了 vpAdapter = new VpAdapter(getSupportFragmentManager() ...

  3. 中控考勤机SDK使用中员工姓名的处理( c# )

    公司使用的考勤机是中控的指纹考勤机,但是中控的型号乱七八糟,通过程序读出来的型号和实际标的型号不一致. 另外,提供的开发包的C#版本的Demo中调用 axCZKEM1.ReadAllUserID(iM ...

  4. 通达OA 同步中控考勤机 增强版

    如果你用的是中控考勤机且考勤机能联网,那恭喜有福了! 最近发现考勤机提供web方式查询,经过调试可以用程序直接读取考勤机数据跨过考勤机软件及其access数据库,数据同步及时性.可靠性大幅提高. 通达 ...

  5. 项目总结[2]_svg+ajax+webservice+pSpace sdk实现实时数据的web展示

    1.使用svg实现组态画面和动态数据展示 通过js的定时器调用webservice方法获取数据后更新节点数据 /// <summary>启动定时刷新</summary> fun ...

  6. 20190319xlVBA_根据考勤数据统计缺勤缺考数据

    Sub SubtotalPickFile() Dim StartTime As Variant Dim UsedTime As Variant StartTime = VBA.Timer Dim fi ...

  7. APP数据埋点分类方式

    1.数据埋点的重要性     在现实工作中,数据的整体流程为:数据生产-数据采集-数据处理-数据分析和挖掘-数据可视化,其中,数据采集是很重要的一个环节,数据采集得全不全.对不对,直接决定数据广度和质 ...

  8. Android数据存储五种方式总结

    本文介绍Android平台进行数据存储的五大方式,分别如下: 1 使用SharedPreferences存储数据     2 文件存储数据       3 SQLite数据库存储数据 4 使用Cont ...

  9. Android 讯飞语音听写SDK快速接入(附空指针解决和修改对话框文字方法)

    1.账号准备工作 首先要有一个讯飞的账号啦,为后面申请APPID.APPKey等东西做准备.顺带一提:讯飞对不同认证类型用户开 放的SDK的使用次数是有不同的,详情如下图. 账号申请完成后,需要去你自 ...

随机推荐

  1. 《京东上千页面搭建基石——CMS前后端分离演进史》阅读笔记

    一.背景 CMS即内容管理系统,目的是用于快速进行网站建设或者网页开发. 对于京东网站部门来说,CMS核心目的是用来快速开发和上线各种页面,诸如各种垂直频道页. 二.CMS核心目的 进行数据和模板的统 ...

  2. java 备用待迁移

    Java基础 2018年如何快速学Java 泛型就这么简单 注解就这么简单 Druid数据库连接池就是这么简单 Object对象你真理解了吗? JDK10都发布了,nio你了解多少? COW奶牛!Co ...

  3. MySQL索引原理(三)

    多个单列索引和联合索引的区别详解 背景:为了提高数据库效率,建索引是家常便饭:那么当查询条件为2个及以上时,我们是创建多个单列索引还是创建一个联合索引好呢?他们之间的区别是什么?哪个效率高呢?我在这里 ...

  4. unix udp sendto 最大可发送的数据长度

    sendto 的最大可发送数据长度受限于两个值. 第一 [2^16 -1 - 8 -20] 第二 [SO_SNDBUF] 解释受限于[2^16-1-8-20] 数据封装过程 第一步: 用户层 : us ...

  5. quartus仿真提示: Can't launch the ModelSim-Altera software

    quartus仿真提示: Can't launch the ModelSim-Altera software 2017年07月13日 17:54:50 小怪_tan 阅读数:3255   路径中的结尾 ...

  6. ios兼容性收集整理

    1. ios系统兼input输入框光标问题 异常现象:苹果手机文本输入框样式异常——光标聚焦到文本框,光标高度充满文本框,输入内容,光标高度为文本框上边框到输入内容底部: 光标聚焦: 输入内容: 异常 ...

  7. 在 Hibernate 中inverse的属性

    hibernate配置文件中有这么一个属性inverse,它是用来指定关联的控制方的.inverse属性默认是false,若为false,则关联由自己控制,若为true,则关联由对方控制.见例子: 一 ...

  8. java 快速定位线上cpu偏高

    1.top -c 加 大写P 查找高进程ID 2.top -Hp 加 大写 P 查找高线程ID 3.printf '%x\n' 线程ID 转成16进制 4.jstack 进程ID | grep 16进 ...

  9. Java 8并行流的性能陷阱

    并行化流被分成多个块,每个块独立处理,结果在最后汇总. CPU密集型代码如下: private long countPrimes(int max) {     return range(1, max) ...

  10. 自动问答最新研究成果展示(SQuAD)

    地址:https://rajpurkar.github.io/SQuAD-explorer/ Stanford Question Answering Dataset (SQuAD) is a read ...