問題
前同事撰寫的對中控考勤機資料集成專案當中,打卡資料不能實時進行上傳到平臺當中,一直靠定時全量上傳來同步資料,
閱讀代碼后,發現代碼中有實時上傳資料的邏輯,但是運行一段時間后,中控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】單元訊息回圈造成的,
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/123940.html
標籤:C#
