中制御勤務計Iface 302マルチスレッド操作時にイベントを購読できない

2674 ワード

シーン:
各事務所に中制御勤務計Iface 302を設置し、各事務所の従業員が通勤報告時に指紋や顔紋を使って自動登録を行い、検証に成功した後、サービス呂と通信記録に関する勤務情報を行う.
 
条件:
Iface 302デバイスは自動接続機能をサポートしていないため、サーバにおいて各サービスポイントの接続状況を定期的かつ能動的にポーリングする必要がある.
 
問題1:
Iface 302との通信は主にメーカーを通じて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コンポーネントを呼び出すたびにブロックされます.
 
問題2:
ブログパークでは、スレッドに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回電話を繰り返しても連絡が取れず、公式サイトに伝言を残しても何のフィードバックもありません.
 
ヘルプ:
各同業者はこの問題をどのように解決しますか?