|
在做項目時,遇到同步ERP數(shù)據(jù)的問題,客戶要求是:程序中,設(shè)置一個開始時間,再設(shè)置一個時間間隔,讓程序每隔一段時間導出銷售記錄,這個開始時間和時間間隔可以手動修改設(shè)定。 首先,要讓程序定時執(zhí)行任務(wù),可以使用ASP.NET中的Timer計時,不過這個定時不是很準,如果用它,還會遇到其他的問題,后面會提到。第二種方法是,使用一個叫做:Quartz.NET開源項目,專門用來調(diào)度定時作業(yè)。 這次項目中,我用到的就是Quartz.NET組件,用他來定時調(diào)度作業(yè),是很方便,不過問題也來了:當程序運行一段時間后,發(fā)現(xiàn)自動任務(wù)停止了。在網(wǎng)上查了查資料,說法不一。 后來多方查資料以及自己試驗證明:原來是網(wǎng)站應(yīng)用程序在沒有請求時,過一定的時間就會停止應(yīng)用程序,具體點來說,就是網(wǎng)站中的最后一個session結(jié)束時,網(wǎng)站應(yīng)用程序就會結(jié)束。當然就會觸發(fā)Application_End事件。隨之定時任務(wù)也會停掉。 這個問題在網(wǎng)上也有很多種說法,比如有人建議:在Application_End中用程序模擬請求網(wǎng)站,重新開始Application_Start事件,也給出了程序代碼:http:///technology/aspnet-scheduled-tasks-with-quartznet.html這里有詳細說明。不過我照博主的做法,并沒有實現(xiàn)我想要的功能。不過他是用來處理IIS應(yīng)用程序池回收的問題的。 最后,發(fā)現(xiàn)了一個簡單的處理方式,利用ASP.NET的緩存超時技術(shù)。下面具體來闡明,基本思路: 在應(yīng)用程序啟動時,用程序緩存一個網(wǎng)站中的頁面。在緩存網(wǎng)頁時,設(shè)置好緩存過期時間,以及緩存過期時觸發(fā)的回調(diào)事件,緩存過期時觸發(fā)的回調(diào)事件這是關(guān)鍵。在緩存過期時用程序模擬請求網(wǎng)站頁面,再次緩存,循環(huán)之… 代碼說明:(全在Global.asax里)
====================================2013-8-2 后記================================================ 在WebForm中使用Quartz.Net組件,個人測試結(jié)果,感覺也不夠穩(wěn)定,最終是由 Winform客戶端程序+Quartz.NET組件實現(xiàn),程序一直放在服務(wù)器上跑著。 為了防止服務(wù)器端程序停掉,可以寫成windows服務(wù),這樣服務(wù)器一啟動,就會執(zhí)行任務(wù),只要服務(wù)器沒停,程序也會一直運行。 當然,這只能適用于獨立主機,虛擬空間就不行了。 附: 1.如何編寫windows服務(wù): http://msdn.microsoft.com/zh-cn/library/vstudio/9k985bc9.aspx http://www.cnblogs.com/tuyile006/archive/2006/11/27/573654.html 2.windows服務(wù)輔助類:http://blog.csdn.net/a497785609/article/details/9103129 ----------------------------------------- 設(shè)計IIS的解決方法 1.長期無用戶訪問網(wǎng)頁,asp.net 會自動進入Application_End事件(時間長短可以配置IIS) 以上幾條都會觸發(fā)Application_End事件,如果你在asp.net的Application_State事件里做了一下應(yīng)用(比如說定時器的計劃任務(wù))Application_End事件可能會使定時器停止。想要避免這種情況的發(fā)送就要注意要上面的幾個條件和修改IIS設(shè)置了。
在IIS中找到這個站點所用的程序池,點擊“高級設(shè)置...” 在打開的列表中更改以下設(shè)置: |
|
|