Используйте zkemkeeper.dll, как подключить и прослушать несколько устройств? - PullRequest
0 голосов
/ 13 апреля 2020

У меня есть приложение winform для подключения и прослушивания 30 устройств записи расписания. Моя программа пишет около 10000 записей в день. Но до сих пор не хватает около 300-400 записей в день. Я думаю, много событий происходит в секунду. Как избежать пропущенных записей? Пожалуйста, помогите мне, спасибо!

/ ************* Это мой исходный код ************** /

//ZkemClient.cs: using zkemkeeper.dll
public bool Connect_Net(string IPAdd, int Port)
    {
        if (objCZKEM.Connect_Net(IPAdd, Port))
        {
            //objCZKEM.OnConnected -= new _IZKEMEvents_OnConnectedEventHandler(ObjCZKEM_OnConnected);
            //objCZKEM.OnDisConnected -= new _IZKEMEvents_OnDisConnectedEventHandler(objCZKEM_OnDisConnected);
            //objCZKEM.OnEnrollFinger -= ObjCZKEM_OnEnrollFinger;
            //objCZKEM.OnFinger -= ObjCZKEM_OnFinger;
            //objCZKEM.OnAttTransactionEx -= new _IZKEMEvents_OnAttTransactionExEventHandler(zkemClient_OnAttTransactionEx);

            //65535, 32767
            if (objCZKEM.RegEvent(1, 65535))
            {
                // [ Register your events here ]
                // [ Go through the _IZKEMEvents_Event class for a complete list of events
                objCZKEM.OnConnected += new _IZKEMEvents_OnConnectedEventHandler(ObjCZKEM_OnConnected);
                objCZKEM.OnDisConnected += new _IZKEMEvents_OnDisConnectedEventHandler(objCZKEM_OnDisConnected);
                objCZKEM.OnEnrollFinger += ObjCZKEM_OnEnrollFinger;
                objCZKEM.OnFinger += ObjCZKEM_OnFinger;
                objCZKEM.OnAttTransactionEx += new _IZKEMEvents_OnAttTransactionExEventHandler(zkemClient_OnAttTransactionEx);
            }
            /*if (!objCZKEM.DisableDeviceWithTimeOut(Int16.Parse(iMachineCode), 1))
            {
                objCZKEM.GetLastError(ref iLastError);
                Logger.wrteLogError("System", "ZKTeco Error Code", iLastError.ToString(), "");
            }*/

            return true;
        }
        else
        {
            objCZKEM.GetLastError(ref iLastError);
            Logger.wrteLogError("System", "ZKTeco Error Code", iLastError.ToString(),"");
        }
        return false;
    }

 private void zkemClient_OnAttTransactionEx(string EnrollNumber, int IsInValid, int AttState, int VerifyMethod, int Year, int Month, int Day, int Hour, int Minute, int Second, int WorkCode)
    {

        try
        {
            using (StreamWriter writetext = new StreamWriter(@"log\write.txt", true))
            {
                String sVerifyMethod = "";

                switch (VerifyMethod)
                {
                    case 0:
                        sVerifyMethod = "Password";
                        break;
                    case 1:
                        sVerifyMethod = "Finger";
                        break;
                    case 2:
                        sVerifyMethod = "Card";
                        break;
                    default:
                        sVerifyMethod = "Unknow";
                        break;
                }

                String sScanDate = Year + "/" + Month + "/" + Day + " " + Hour + ":" + Minute + ":" + Second;

                writetext.WriteLine(iMachineCode + "," + EnrollNumber + "," + sScanDate + "," + DateTime.Now + "," + sVerifyMethod + "," + VerifyMethod);
                writetext.Flush();
                writetext.Close();

            }
       }
        catch (Exception ex)
        {
            objCZKEM.GetLastError(ref iLastError);
            Logger.wrteLogError("Tran EnrollNumber, "transfer failed with error code " + iLastError, ex.Message + " " + ex.StackTrace.ToString());
        }
    }     

 //MasterForm.cs: for connect 30 devices and listen
 Int iMaxDeviceQty = 30;

   public static ZkemClient[]   objZkeeperList = new ZkemClient[iMaxDeviceQty];
for (int i = 0; i < objVNMDeviceInfo.Count; i++)
{
   objZkeeperList[i] = new ZkemClient(RaiseDeviceEventNew, objVNMDeviceInfo[i].MachineNumber.ToString(), sConnectionString);

     isConnect = objZkeeperList[i].Connect_Net(objVNMDeviceInfo[i].IPAddress, int.Parse(objVNMDeviceInfo[i].Port));

     if (isConnect == true)
     {
          Logger.wrteLog(objVNMDeviceInfo[i].IPAddress, objVNMDeviceInfo[i].MachineNumber.ToString(), "connect successfully");
     }
   }
...