前兩天寫了一個定時發送天氣預報的程序,老是出現這樣或那樣的bug,甚至有時候出現拒絕服務的錯誤。去網上找了一下資料,發現是自己的定點發送存在一定的問題。現在總結一下經驗,並和大家一起探討一下。
首先我們要使用global.asax中的事件,在Application_Start事件中啟動我們的任務,在Application_End中停止我們的任務。 當然啟動我們的任務,必須是啟動一個線程去完成相應的工作。
開始,我在線程中做的事情是每隔900ms判斷一下,當前的事件是否等於指定的時間,如果等於的話,就執行相應的任務,但是這樣容易出現的毛病就是訪問太頻繁了,占用過多的cpu資源。
後來,我想到的方法是,計算現在到定點時間的ms數,由以下函數完成:
private int GetSleepTime(int hour, int min, int second) { DateTime now = DateTime.Now; int sleep = (((hour - now.Hour) * 60 + (min - now.Minute)) * 60 + (second - now.Second)) * 1000; if (sleep < 0) sleep += 24 * 3600 * 1000; return sleep; }
這樣直接sleep到指定的事件點就可以了,然後再執行我們的任務。
為了能夠中途能夠認為停止,用sleep就不是很方便了,所以我決定用wait,具體的線程方法如下:
private void Run() { while (isStart) { int sleep = GetSleepTime(19, 0, 0); lock (locker) { Monitor.Wait(locker, sleep); } if (isStart) SendWeatherReport(); // 這是我要定點完成的工作 } }