ibcadmin 发表于 2019-9-26 09:16:29

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

<p> </p>
<h2>题目</h2>
<p>  前同事编写的对中控考勤机数据集成项目当中,打卡数据不能及时进行上传到平台当中,一直靠定时全量上传来同步数据。</p>
<p>  阅读代码后,发现代码中有及时上传数据的逻辑,但是运行一段时间后,中控zkemkeeper SDK中的变乱失效,导致员工打卡数据没有及时上传。</p>
<h2>缘故因由</h2>
<p>  查察中控SDK Demo中的示例代码,发实际现逻辑是一样的。唯一不同的是demo利用的是winform项目编写,打卡机同步项目是用windows服务项目编写的。</p>
<p>  发现中控考勤机 zkemkeeper SDK是COM组件封装,这和winform窗体控件是一样的,基于消息循环机制。比方:winfrom项目当中 main函数都如许启动主窗体 Application.Run(new form1()); </p>
<p><div align="center"></div></p>
<p>  也就是说当你实现sdk类的时间,不在线程中进行消息循环,就有大概导致变乱失效。</p>
<h2>解决方式</h2>
<p>  定位了大概导致题目的缘故因由,我对考勤机数据获取类进行如下改动:</p>
<p style="text-align: left;"> </p>
<p style="text-align: left;">  1. 为了简朴将连接连接打卡机装备和触发打卡的方法直接移动到一个form当中去</p>

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

<p style="text-align: left;">  2. 在启动打卡机连接的线程中声明为 STAThread</p>

Thread equipmentThread = new Thread(StartEquipmentForm);
equipmentThread.IsBackground = true;
equipmentThread.SetApartmentState(ApartmentState.STA);
equipmentThread.Start();<br /><br />
<p>/// <summary><br />/// 启动装备连接from<br />/// </summary><br /><br />private void StartEquipmentForm()<br />{<br />  Application.Run(frmEquipment);</p>
<p>}</p>
<p> </p>

<p style="text-align: left;">  3. 关闭数据集成服务时 跨线程 利用 form.Invoke 关照窗体关闭连接</p>
<p> </p>

frmEquipment.Invoke(new Action(() =>
{
   frmEquipment.Close();
}));

<p>  </p>
<p>  经过几天测试根本运行稳固,根本确定打卡机变乱触发失效是由于原服务,没有对COM组件运行于单线程【STA】单位消息循环造成的。</p>
<p> </p><br><br/><br/><br/><br/><br/>来源:<a href="https://www.cnblogs.com/magicbowie/archive/2019/09/25/11585591.html" target="_blank">https://www.cnblogs.com/magicbowie/archive/2019/09/25/11585591.html</a>
页: [1]
查看完整版本: 中控考勤机使用 zkemkeeper SDK订阅考勤数据事件失效解决方式