2008-09-05 48 views
7

給定一個ASP.NET應用程序,我需要定期運行維護過程(每天,每小時等)。在ASP.NET上啓動維護過程的最佳實踐是什麼?

什麼是在不依賴服務器上的計劃任務等外部進程(假設我無法訪問服務器共享主機環境)的情況下完成此操作的最佳方法。

+0

這個問題是堆棧溢出題外話,因爲它正在尋求最佳實踐,這吸引了斟酌答案。 – cybermonkey 2015-09-12 16:04:47

回答

11

下面是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/

+1

傑夫阿特伍德說:2009年2月12日上午6點50分 不,我們已經切換到一個專門的任務。我們絕對超出了這個技巧。儘管我認爲小網站很好! – 2010-11-03 18:40:39

2

這樣做的一種方法是,如果你不需要在預定的時間內完成它,但只需要「偶爾清理一次」,就是在你的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​​你「咬」每次關閉更多的控制。

0

這是一個外部過程,我不知道如何可靠的,但你可以設置一臺機器上類似的一些東西你知道總是在www.webcron.org

基本上它所做的是按照您要求的時間表打到您請求的頁面。

實質上,您可以按照定期計劃在網頁上點擊任何內容,以啓動維護任務。

傑夫和喬爾還討論了通過其他方法在最近的播客中做類似的事情。

1

雖然StackOverflow的方式確實是獨一無二的,但您也可能想要監視此question,因爲它涉及。

2

雖然緩存解決方案適用於簡單情況,但如果您的調度需求發生變化,您將會失去運氣。相反,您可以使用流行的java框架Quartz的端口Quartz.NET,它非常靈活。

相關問題