1. 程式人生 > WINDOWS開發 >C#中遇到定時器問題

C#中遇到定時器問題

今天做專案的時候遇到一個定時器的問題,具體的需求是需要每天在具體的某個時間出發某個方法,訪問程式連線的裝置資訊,儲存到資料庫,方便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);
            }
        }

這是剛寫完,本地測試了,還沒有正式放到伺服器上去執行,最後的總體執行結果有待觀察