C#中遇到定時器問題
阿新 • • 發佈:2020-06-03
今天做專案的時候遇到一個定時器的問題,具體的需求是需要每天在具體的某個時間出發某個方法,訪問程式連線的裝置資訊,儲存到資料庫,方便Web端做成報表。
進過多種嘗試,最終確定下來思路是(我是把該定時方法放到初始化啟動項裡面的,每次一開啟程式就回去執行這個程式):
1.程式啟動的時候啟動該方法,獲取當前時間和需要執行該方法的那個時間
DateTime dttimeZero = DateTime.Parse(DateTime.Now.ToShortDateString() + " 23:59:59"); //獲取當天0點的時間 DateTime dateTime = DateTime.Now; //獲取當前時間
2.計算兩個之間的時間差,轉換成毫秒
TimeSpan ts = new TimeSpan(); //獲取時間間隔 ts = dttimeZero - dateTime; //獲取時間差 int second = (ts.Hours * 3600 + ts.Minutes * 60 + ts.Seconds) * 1000;
3.然後在新的方法中建立一個執行緒,但是演示啟動這個執行緒,延時的時間就是上面計算的時間差
Task.Factory.StartNew<int>(() => { Thread.Sleep(second);//休眠的時間==當前時間距離當天0點的時間,轉換成毫秒 //具體執行的方法 });
4.首次執行該方法後,下次執行就是24小時後,所以寫一while迴圈,迴圈間隔為86400000,24小時轉換成的毫秒數
while (true) { EQPService eqps = new EQPService(); var eqpInfo = eqps.GetConnectedEquipments();//獲取所有連線的裝置資訊;foreach (var eqpid in eqpInfo) { List<ushort> DATE = new List<ushort>(); DATE.Add(29);//獲取裝置當前正常Run貨累計時長 DATE.Add(39);//獲取當前裝置執行累計時長 SECSCmd.S1F3Command(eqpid.EQP_ID,DATE,"OEEmonitor"); //詢問裝置當前累計正常Run貨時長 } Thread.Sleep(86400000); }
完整的程式碼如下:
public void OEEmonitor() { try { DateTime dttimeZero = DateTime.Parse(DateTime.Now.ToShortDateString() + " 23:59:59"); //獲取當天0點的時間 DateTime dateTime = DateTime.Now; //獲取當前時間 TimeSpan ts = new TimeSpan(); //獲取時間間隔 ts = dttimeZero - dateTime; //獲取時間差 int second = (ts.Hours * 3600 + ts.Minutes * 60 + ts.Seconds) * 1000; Task.Factory.StartNew<int>(() => { Thread.Sleep(second); //休眠的時間==當前時間距離當天0點的時間,轉換成毫秒 while (true) { EQPService eqps = new EQPService(); var eqpInfo = eqps.GetConnectedEquipments();//獲取所有連線的裝置資訊; foreach (var eqpid in eqpInfo) { List<ushort> DATE = new List<ushort>(); DATE.Add(29);//獲取裝置當前正常Run貨累計時長 DATE.Add(39);//獲取當前裝置執行累計時長 SECSCmd.S1F3Command(eqpid.EQP_ID,"OEEmonitor"); //詢問裝置當前累計正常Run貨時長 } Thread.Sleep(86400000); } }); } catch (Exception e) { LoggerService.CIMLogger.Error($"Method [{nameof(OEEmonitor)}] is error",e); } }
這是剛寫完,本地測試了,還沒有正式放到伺服器上去執行,最後的總體執行結果有待觀察