給定一個ASP.NET應用程序,我需要定期運行維護過程(每天,每小時等)。在ASP.NET上啓動維護過程的最佳實踐是什麼?
什麼是在不依賴服務器上的計劃任務等外部進程(假設我無法訪問服務器共享主機環境)的情況下完成此操作的最佳方法。
給定一個ASP.NET應用程序,我需要定期運行維護過程(每天,每小時等)。在ASP.NET上啓動維護過程的最佳實踐是什麼?
什麼是在不依賴服務器上的計劃任務等外部進程(假設我無法訪問服務器共享主機環境)的情況下完成此操作的最佳方法。
下面是StackOverflow上的方式做它:
private static CacheItemRemovedCallback OnCacheRemove = null;
protected void Application_Start(object sender, EventArgs e)
{
AddTask("DoStuff", 60);
}
private void AddTask(string name, int seconds)
{
OnCacheRemove = new CacheItemRemovedCallback(CacheItemRemoved);
HttpRuntime.Cache.Insert(name, seconds, null,
DateTime.Now.AddSeconds(seconds), Cache.NoSlidingExpiration,
CacheItemPriority.NotRemovable, OnCacheRemove);
}
public void CacheItemRemoved(string k, object v, CacheItemRemovedReason r)
{
// do stuff here if it matches our taskname, like WebRequest
// re-add our task so it recurs
AddTask(k, Convert.ToInt32(v));
}
詳情:http://blog.stackoverflow.com/2008/07/easy-background-tasks-in-aspnet/
傑夫阿特伍德說:2009年2月12日上午6點50分 不,我們已經切換到一個專門的任務。我們絕對超出了這個技巧。儘管我認爲小網站很好! – 2010-11-03 18:40:39
這樣做的一種方法是,如果你不需要在預定的時間內完成它,但只需要「偶爾清理一次」,就是在你的Global.asax Session_OnEnd()中創建一個函數,將創建一個1到100之間的隨機數,如果數字是50,則執行維護任務。
Offcourse您可以減少「100」以使任務更頻繁地發生。
此外,還有一篇文章標題爲「使用ASP.NET來運行預定作業的Windows服務」,其登錄日期爲http://www.codeproject.com/aspnet/ASPNETService.asp,該文章使用過期緩存模擬計時器。它聲稱它可以在任何託管網站上運行。
如果您使用的是最後一個,請閱讀有關此技術職務此評論:
你需要真正要小心的 長度任務運行。每一個新的 任務是一個新的工作者線程和 有限的那些 - 因爲 它從管理的 線程池「借用」一個線程。
開始在框架V3.5線程 最大數量爲 增加10倍,從25到250,但 現在有一個對數啓動時 他們,所以它多爾斯出更多的線程 它變得吝嗇與他們。如果您從 託管線程池中的可用線程中運行 - 您的響應 時間將通過 屋頂。
你真的在這裏寫的是一個 消息/排隊系統。
如果您正在更新緩存中的內容,請務必 - 踢 關閉一項新任務。如果你正在做 像下載二次 HTTP資源或某種 密集型數據庫工作 - 寫 Windows服務和使用的隊列 可以讓你在多少0你「咬」每次關閉更多的控制。
這是一個外部過程,我不知道如何可靠的,但你可以設置一臺機器上類似的一些東西你知道總是在www.webcron.org。
基本上它所做的是按照您要求的時間表打到您請求的頁面。
實質上,您可以按照定期計劃在網頁上點擊任何內容,以啓動維護任務。
傑夫和喬爾還討論了通過其他方法在最近的播客中做類似的事情。
雖然StackOverflow的方式確實是獨一無二的,但您也可能想要監視此question,因爲它涉及。
雖然緩存解決方案適用於簡單情況,但如果您的調度需求發生變化,您將會失去運氣。相反,您可以使用流行的java框架Quartz的端口Quartz.NET,它非常靈活。
這個問題是堆棧溢出題外話,因爲它正在尋求最佳實踐,這吸引了斟酌答案。 – cybermonkey 2015-09-12 16:04:47