zoukankan      html  css  js  c++  java
  • 中控考勤机使用 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】单元消息循环造成的。

  • 相关阅读:
    C#2.0技术探讨(1):匿名方法
    C#测试类的嵌套
    介绍几款博客发布工具,绝对好用
    HttpModule,对ASP.NET的事件处理进行过滤,干预
    C#中,控制台模式可以使用定时器吗?
    const常量和static静态只读变量有何区别
    C#设计模式(2):工厂模式
    ASP.NET 的数据绑定语法
    DataAdapter数据集DataSet和数据库的同步(2):使用DataAdapter来更新数据集
    TCP编程(5):服务器端 TcpListener
  • 原文地址:https://www.cnblogs.com/magicbowie/p/11585591.html
Copyright © 2011-2022 走看看