• 中控考勤仪IFace302多线程操作时无法订阅事件


    场景:

    在各办事点安装中控考勤仪Iface302,各办事点的工作人员上下班报到时使用指纹或面纹进行自动登记,验证成功后将与服务吕进行通讯记录相关的考勤信息。

    条件限制:

    由于Iface302设备不支持自动连接功能,也因此需要在服务器中定时地、主动地去轮询各办事点的连接状况。

    问题一:

    与IFace302通讯主要通过厂家对COM组件封装的dll二次开发,在线程环境的状态下无法订立考勤的事件,验证事件,类似的代码如下:

    zkemkeeper.CZKEMClass zkDevice = new zkemkeeper.CZKEMClass();
    
    Thread th = new Thread((ThreadStart)delegate()
     {
                _isConnected = zkDevice.Connect_Net(_deviceip, _deviceport);   
    
                if (_isConnected == true)
                {
                    //连接成功后才能注册
                    //如果断开后事件也自然失效                    
                    if (zkDevice.RegEvent(1, 65535))//Here you can register the realtime events that you want to be triggered(the parameters 65535 means registering all)
                    {
    
              zkDevice.OnFinger += new zkemkeeper._IZKEMEvents_OnFingerEventHandler(zkDevice_OnFinger);
    
          }
     });
     th.IsBackground = true;
     th.Start();
    

     此代码是可以正常运行但无法注册事件,而如果不使用线程每次调用COM组件的方法都是有一段时间的阻塞。

    问题二:

    经了解,博客园有人提出在线程中增加 Application.Run();代码可以解决无法订阅事件的问题,即:

    zkemkeeper.CZKEMClass zkDevice = new zkemkeeper.CZKEMClass();
    
    Thread th = new Thread((ThreadStart)delegate()
     {
                _isConnected = zkDevice.Connect_Net(_deviceip, _deviceport);   
    
                if (_isConnected == true)
                {
                    //连接成功后才能注册
                    //如果断开后事件也自然失效                    
                    if (zkDevice.RegEvent(1, 65535))//Here you can register the realtime events that you want to be triggered(the parameters 65535 means registering all)
                    {
    
              zkDevice.OnFinger += new zkemkeeper._IZKEMEvents_OnFingerEventHandler(zkDevice_OnFinger);
    
          }
                Application.Run();  //新加代码,后是可以正常订阅事件
     });
     th.IsBackground = true;
     th.Start();
    

     在代码最后加上Application.Run()的确是可以解决无法订阅事件的问题,但当程序运行一段时间后就会出现System.OutOfMemoryException: 引发类型为“System.OutOfMemoryException”的异常。

    由于是几个小时才出现的内存溢出异常,通过观察任务管理器可以发现以下问题:

    在多线程中使用Application.Run()方法会导致到内存使用、虚拟内存大小、页面缓冲池、线程数是不断地增加

    最终导致System.OutOfMemoryException”的异常。

    嘀咕几句:

    在这里再次吐槽一下中控科技的售后服务极差,反复打了N次电话均无法连通,在官网留言亦无任何反馈。

    寻求帮助:

    各同行该问题如何解决呢?

  • 相关阅读:
    判断三点是否共线
    canvas判断点是否在路径内
    如何获取canvas当前的缩放值
    杨辉三角与排列组合数
    WEB 三维引擎在高精地图数据生产的探索和实践
    高精地图数据应用分发引擎建设实践
    视觉感知未来,高德数据采集模型部署实践!
    高德Serverless平台建设及实践
    高德客户端低代码系统架构实践
    数据人必读!玩转数据可视化用这个就够了——高德LOCA API 2.0升级来袭!
  • 原文地址:https://www.cnblogs.com/samlin/p/5368097.html
Copyright © 2020-2023  润新知