1. 程式人生 > >C#windows服務建立定時器

C#windows服務建立定時器

    這幾天公司要寫一個定時Windows服務需要在下午一點和五點觸發,需要呼叫WebService介面,通過傳過來的資料下載客戶伺服器上的Excel。在網上找了很多關於定時器的文章但是好多都是間隔幾分鐘觸發或者幾小時觸發。但是沒有我所需要的,然後自己找了一篇,給了我靈感,然後用到了自己的專案上。閒話不多說,直接上程式碼。

Thread ReadFileThread;
        public Service1()
        {
            InitializeComponent();
        }
        protected override void OnStart(string[] args)
        {
            try
            {
                ReadFileThread = new Thread(ReadFileTimer);
                ReadFileThread.Start();
            }
            catch (Exception e)
            {
                Logs.WriteTxTLogs(e.Message);
            }
            
        }
        protected override void OnStop()
        {
            ReadFileThread.Abort();
        }
        private void ReadFileTimer()
        {
            DateTime NowTime = DateTime.Now;
            DateTime time1;//定義觸發時間
            try
            {
                if (NowTime.Hour >= 13)
                {
                    time1 = Convert.ToDateTime(NowTime.AddDays(1).ToString("yyyy-MM-dd ") + "13:00:00");
                }
                else
                {
                    time1 = Convert.ToDateTime(NowTime.ToString("yyyy-MM-dd ") + "13:00:00");
                }
                var timefirst = new Timer(new TimerCallback(ReadFile), null, Convert.ToInt32((time1 - NowTime).TotalMilliseconds), 24 * 3600 * 1000);

                if (NowTime.Hour >= 17)
                {
                    time1 = Convert.ToDateTime(NowTime.AddDays(1).ToString("yyyy-MM-dd ") + "17:00:00");
                }
                else
                {
                    time1 = Convert.ToDateTime(NowTime.ToString("yyyy-MM-dd ") + "17:00:00");
                }
                var timesecond = new Timer(new TimerCallback(ReadFile), null, Convert.ToInt32((time1 - NowTime).TotalMilliseconds), 24 * 3600 * 1000);
            }
            catch (Exception e)
            {
                Logs.WriteTxTLogs("ReadFileTimer()錯誤資訊:" + e);
            }
        }

      上面是建立Timer定時器的程式碼,我在ReadFileTimer方法裡建立兩個定時器,一個下午一點,另一個下午五點,每天在這兩個時間定時執行任務。這兩個定時器的主要方法是Timer,我拿一個方法說明一下:

var timefirst = new Timer(new TimerCallback(ReadFile), null, Convert.ToInt32((time1 - NowTime).TotalMilliseconds), 24 * 3600 * 1000);

     Timer的引數:

        第一個引數表示要呼叫的方法。

        第二個引數是一個包含回撥方法要使用的資訊的物件,或者為 null,我這裡直接寫的null。

        第三個引數從程式碼可以看出是當前時間到觸發時間的時間差(以毫秒為單位),主要用於第一次觸發,若需要立即執行可寫設定為0。如果需要除錯可以設定延時觸發,延時一分鐘可以就寫60000,注意是單位毫秒要*1000。

        第四個引數是呼叫callback的時間間隔。我這裡是一天所以寫24 * 3600 * 1000。

     順便簡單說一下關於windows服務的除錯。我只知道兩種方法,一是記錄日誌,而是直接除錯。日誌的程式碼直接放在下面,需要的自取:

/// <summary>
        /// 寫文字日誌
        /// </summary>
        /// <param name="Message"></param>
        public static void WriteTxTLogs(string Message)
        {
            try
            {
                string logfilename = "Logs.txt";
                string logfilepath = @"D:\GitProject\ReadFile\ReadFile\Logs\" + logfilename;
                if (File.Exists(logfilepath))
                {
                    StreamWriter sw = new StreamWriter(logfilepath, true);
                    sw.WriteLine(DateTime.Now.ToString() + ":" + Message);
                    sw.Flush();
                    sw.Close();

                }
                else
                {
                    StreamWriter sw = new StreamWriter(logfilepath, true);
                    sw.WriteLine(DateTime.Now.ToString() + ":" + Message);
                    sw.Flush();
                    sw.Close();
                }
            }
            catch (Exception e)
            {

                throw;
            }
           
        }

        只需改一下文字路徑,複製貼上即可

        第二種直接除錯,拿我上一個定時器舉例子,設定60s(都是單身老司機手速應該沒什麼問題),如果不是單身老司機就設定值長一點,然後啟動服務,切換到VS點選除錯-附加程序-選擇自己的服務,點選新增即可(別忘了設斷點)。

 


        OK,在公司呆著無聊,把自己剛做完的東西寫一寫,希望對別人有幫助。拜拜,下期見。