中控考勤机使用 zkemkeeper SDK订阅考勤数据事件失效解决方式
问题
前同事编写的对中控考勤机数据集成项目当中,打卡数据不能实时进行上传到平台当中,一直靠定时全量上传来同步数据。
阅读代码后,发现代码中有实时上传数据的逻辑,但是运行一段时间后,中控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订阅考勤数据事件失效解决方式的更多相关文章
- MapReduce数据倾斜的解决方式
数据倾斜:由于数据分布不均匀,造成数据大量的集中到一点,造成数据热点.map /reduce程序执行时,reduce节点大部分执行完毕,但是有一个或者几个reduce节点运行很慢,导致整个程序的处理时 ...
- Android Viewpager加Fragment做界面切换时数据消失的解决方式
今天遇到多个Fragment切换,回来后页面空白的情况,找到这个博客方法设置了一下,就可以了 vpAdapter = new VpAdapter(getSupportFragmentManager() ...
- 中控考勤机SDK使用中员工姓名的处理( c# )
公司使用的考勤机是中控的指纹考勤机,但是中控的型号乱七八糟,通过程序读出来的型号和实际标的型号不一致. 另外,提供的开发包的C#版本的Demo中调用 axCZKEM1.ReadAllUserID(iM ...
- 通达OA 同步中控考勤机 增强版
如果你用的是中控考勤机且考勤机能联网,那恭喜有福了! 最近发现考勤机提供web方式查询,经过调试可以用程序直接读取考勤机数据跨过考勤机软件及其access数据库,数据同步及时性.可靠性大幅提高. 通达 ...
- 项目总结[2]_svg+ajax+webservice+pSpace sdk实现实时数据的web展示
1.使用svg实现组态画面和动态数据展示 通过js的定时器调用webservice方法获取数据后更新节点数据 /// <summary>启动定时刷新</summary> fun ...
- 20190319xlVBA_根据考勤数据统计缺勤缺考数据
Sub SubtotalPickFile() Dim StartTime As Variant Dim UsedTime As Variant StartTime = VBA.Timer Dim fi ...
- APP数据埋点分类方式
1.数据埋点的重要性 在现实工作中,数据的整体流程为:数据生产-数据采集-数据处理-数据分析和挖掘-数据可视化,其中,数据采集是很重要的一个环节,数据采集得全不全.对不对,直接决定数据广度和质 ...
- Android数据存储五种方式总结
本文介绍Android平台进行数据存储的五大方式,分别如下: 1 使用SharedPreferences存储数据 2 文件存储数据 3 SQLite数据库存储数据 4 使用Cont ...
- Android 讯飞语音听写SDK快速接入(附空指针解决和修改对话框文字方法)
1.账号准备工作 首先要有一个讯飞的账号啦,为后面申请APPID.APPKey等东西做准备.顺带一提:讯飞对不同认证类型用户开 放的SDK的使用次数是有不同的,详情如下图. 账号申请完成后,需要去你自 ...
随机推荐
- Appium-Python-Windows 环境搭建
目录 1.安装JDK 2.安装Android SDK 3.安装Node.js 4.安装Appium server 5.安装Python 6.安装Appium-Python-Client 7.安装pyt ...
- BigDecimal初始化不要用double类型
在进行单价.总价相关的计算时,就会用到BigDecimal. 在初始化时,一个不小心,就可能给自己挖坑. 示例如下: public class BigDecimalInitTest { public ...
- 【java编程】vo、po、dto、bo、pojo、entity、mode如何区分
Java Bean:一种可重用组件,即“一次编写,任何地方执行,任何地方重用”.满足三个条件 类必须是具体的和公共的 具有无参构造器 提供一致性设计模式的公共方法将内部域或暴露成员属性 VO valu ...
- 5G网络类型 ?
TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SE ...
- win7上手机ADB interface无法安装驱动
解决办法: https://blog.csdn.net/riyuexingchen1204/article/details/84594061
- regexp_replace
pandas和SQL数据分析实战 https://study.163.com/course/courseMain.htm?courseId=1006383008&share=2&sha ...
- A Full Hardware Guide to Deep Learning深度学习电脑配置
https://study.163.com/provider/400000000398149/index.htm?share=2&shareId=400000000398149( 欢迎关注博 ...
- NSIS安装或卸载时检查程序是否正在运行
转载:https://www.cnblogs.com/z5337/p/4766415.html 转载:https://www.gongzi.org/nsisbuildqqstop.html 转载:ht ...
- CentOS7下的CDH 6.2.0 安装过程
#install OS centos 7.5#install lsb packageyum install -y redhat-lsb #install net-tools package yum i ...
- 第一次使用markdown
一级标题 二级标题 三家标题 四级标题 五级标题 六级标题 用两个空格来换行 斜体字 斜体字 加粗字体 加粗字体 斜体加粗字体 斜体加粗字体 无序列表用*或者+或者-: 第一箱 第二项 第三项 第四项 ...