2012-11-30 105 views
5

例如,我想在特定時間間隔(小時或日常任務)中調用函數。特定時間間隔內的重複性任務?

我已經使用Timer。但只要我的本地服務器正在工作,它就會工作。例如:

public static void StartYahooWeatherManager() 
{ 
    Timer t = new Timer(1000 * 60 * 60 * 6 /* 6 hours */); 
    t.Elapsed += new ElapsedEventHandler(WriteYahoWeatherRssItemToDb); 
    t.Start(); 
} 

private static void WriteYahoWeatherRssItemToDb(object o, ElapsedEventArgs e) 
{ 
    YahooWeatherManager.InsertYahooWeatherRssItem(YahooWeatherManager.GetYahooWeatherRssItem()); 
} 

我以6小時的間隔向db寫入天氣信息。項目已在Host中。只要我的電腦本地服務器正在運行,計時器事件正在工作。

問:

什麼是錯我的代碼? (或者在WebProject中使用計時器會出現邏輯錯誤?)爲什麼計時器只能在本地服務器工作時工作?

什麼是管理時間間隔任務的最佳方法是什麼? (不需要asp.net)

我希望,我可以解釋這個問題。謝謝。

+0

你真的需要做的是,在ASP.NET應用程序?您是否考慮過創建Windows服務? –

+0

@RuiJarimba,不需要,我也問過。 '管理時間間隔任務的最好方法是什麼?'。對不起,我更新了這個問題。 –

回答

7

爲什麼計時器停止的原因是因爲這個計時器在這本身就是一個Web服務器上託管你的ASP.NET應用程序運行。當此服務器停止或回收應用程序時,AppDomain會與您可能啓動的所有線程一起關閉。這就是爲什麼在ASP.NET應用程序中編寫重複後臺任務是一個非常糟糕的主意。菲爾·哈克blogged about the dangers

正確的方法做,這是東道國,在一個單獨的進程這個代碼的ASP.NET應用程序之外。這可能是一個Windows服務或控制檯應用程序,計劃使用例如Windows調度程序定期運行該應用程序。這樣的代碼保證始終運行。

2

我的建議是創建一個使用計時器的Windows服務,或者創建一個正常的應用程序並創建一個計劃任務,以便在您需要的時間間隔內運行它。這StackOverflow的帖子可能會幫助您:

Windows service and timer

+0

+1。非常感謝... –

0

您可以禁用回收應用程序池您的asp.net應用屬於。內存泄漏對.Net來說很少見,所以大多數時候你可以依靠GC。這也將消除回收後的熱身,並且幾乎不費吹灰之力地改善用戶體驗。

另一個好的解決方案是創建控制檯應用程序並在Windows「Task Scheduler」中安排它。您將有很好的UI來管理何時以及如何運行。維護此類任務比「Windows Service」容易得多,並且需要編寫較少的代碼。