-
C#教程之中控考勤机使用 zkemkeeper SDK订阅考勤数据事件失效解决方式
本站最新发布 C#从入门到精通
试听地址 https://www.xin3721.com/eschool/CSharpxin3721/
试听地址 https://www.xin3721.com/eschool/CSharpxin3721/
问题
前同事编写的对中控考勤机数据集成项目当中,打卡数据不能实时进行上传到平台当中,一直靠定时全量上传来同步数据。
阅读代码后,发现代码中有实时上传数据的逻辑,但是运行一段时间后,中控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】单元消息循环造成的。
栏目列表
最新更新
Python 中如何实现参数化测试?
Appium移动端测试--基础预热
自定义404页面
python redis模块详解
python爬虫--图片懒加载
Python抓取豆瓣电影top250!
Tornado—添加请求头允许跨域请求访问
pycharm设置开发模板/字体大小/背景颜色(
python爬虫公众号所有信息,并批量下载公
docker系列之一:初见docker
.Net Standard(.Net Core)实现获取配置信息
Linux PXE + Kickstart 自动装机
Shell 编程 基础
Shell 编程 条件语句
CentOS8-网卡配置及详解
Linux中LVM逻辑卷管理
1.数码相框-相框框架分析(1)
Ubuntu armhf 版本国内源
Linux中raid磁盘阵列
搭建简易网站
mysql 安装了最新版本8.x版本后的报错:
Mysql空间数据&空间索引(spatial)
如何远程连接SQL Server数据库的图文教程
复制SqlServer数据库的方法
搜索sql语句
sql中返回参数的值
sql中生成查询的模糊匹配字符串
数据定义功能
数据操作功能
将Session值储存于SQL Server中