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

简介:

场景:

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

 

条件限制:

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

 

问题一:

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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();代码可以解决无法订阅事件的问题,即:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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次电话均无法连通,在官网留言亦无任何反馈。

 

寻求帮助:

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

 

转载请注明出处[ http://samlin.cnblogs.com/] 
作者赞赏
 


刚做的招标网: 八爪鱼招标网 请大家多意见


本文转自Sam Lin博客博客园博客,原文链接:http://www.cnblogs.com/samlin/p/5368097.html,如需转载请自行联系原作者
目录
相关文章
|
11月前
SDL事件处理以及线程使用(2)
SDL库中事件处理和多线程编程的基本概念和示例代码,包括如何使用SDL事件循环来处理键盘和鼠标事件,以及如何创建和管理线程、互斥锁和条件变量。
149 1
SDL事件处理以及线程使用(2)
|
数据采集 Java Python
python 递归锁、信号量、事件、线程队列、进程池和线程池、回调函数、定时器
python 递归锁、信号量、事件、线程队列、进程池和线程池、回调函数、定时器
|
设计模式 存储 安全
Java面试题:设计一个线程安全的单例类并解释其内存占用情况?使用Java多线程工具类实现一个高效的线程池,并解释其背后的原理。结合观察者模式与Java并发框架,设计一个可扩展的事件处理系统
Java面试题:设计一个线程安全的单例类并解释其内存占用情况?使用Java多线程工具类实现一个高效的线程池,并解释其背后的原理。结合观察者模式与Java并发框架,设计一个可扩展的事件处理系统
137 1
|
设计模式 存储 缓存
Java面试题:结合单例模式与Java内存模型,设计一个线程安全的单例类?使用内存屏障与Java并发工具类,实现一个高效的并发缓存系统?结合观察者模式与Java并发框架,设计一个可扩展的事件处理系统
Java面试题:结合单例模式与Java内存模型,设计一个线程安全的单例类?使用内存屏障与Java并发工具类,实现一个高效的并发缓存系统?结合观察者模式与Java并发框架,设计一个可扩展的事件处理系统
101 0
|
存储 JSON 运维
【运维】Powershell 服务器系统管理信息总结(进程、线程、磁盘、内存、网络、CPU、持续运行时间、系统账户、日志事件)
【运维】Powershell 服务器系统管理信息总结(进程、线程、磁盘、内存、网络、CPU、持续运行时间、系统账户、日志事件)
403 0
|
消息中间件 缓存 资源调度
【Java项目】使用Nacos实现动态线程池技术以及Nacos配置文件更新监听事件
【Java项目】使用Nacos实现动态线程池技术以及Nacos配置文件更新监听事件
643 0
|
数据采集 监控 NoSQL
一日一技:Python多线程的事件监控
一日一技:Python多线程的事件监控
271 0
|
数据采集 监控 NoSQL
一日一技:Python多线程的事件监控
一日一技:Python多线程的事件监控
360 0
|
消息中间件 监控 安全
单线程事件处理器ControllerEventManager
单线程事件处理器,Controller端定义的一个组件。该组件内置了一个专属线程,负责处理其他线程发送过来的Controller事件。还定义了一些管理方法,为专属线程输送待处理事件。
121 0
|
消息中间件 Java Shell
spring学习笔记(二)spring中的事件及多线程
spring学习笔记(二)spring中的事件及多线程
262 0
spring学习笔记(二)spring中的事件及多线程