2008-09-22 55 views
1

考慮以下代碼...ASP.NET和計時器

using System.Threading; 
//... 
Timer someWork = new Timer(
    delegate(object state) { 
     //Do some work here... 
    }, 
    null, 0, 60000); 

HttpContext.Current.Application["SomeWorkItem"] = someWork; 

難道這是危險的?在應用程序中緩存計時器以在您的網站運行時在後臺執行一些工作似乎安全,但是我想知道是否有人有此經驗。

我敢肯定,寫一個服務在後臺運行,肯定會好很多,但有時這並不總是一個選項。這是另一種選擇嗎?

回答

3

這通常是一個壞主意,因爲System.Threading.Timer使用線程從線程池,同爲ASP.Net。

如果什麼都原因,你的計時器代表塊或停止時,計時器會簡單地開始超時後一個新的線程,吃在現有的ASP.net的線程。

如果他們都開始堵塞,有效地你將不能夠服務於更多的web請求(可能是一件壞事)

3

問題在於您無法保證該過程仍處於活動狀態。基本上,只要感覺像IIS那樣,IIS就會收回這個過程,所以你可能會冒這個過程不被執行的風險。

如果你需要那麼這個工作做完,你需要要麼代碼到網頁呼叫,或者在服務器的後臺運行的服務。

1

這會很危險,因爲可能有些時候工作進程被回收或者AppDomain崩潰並且工作項被殺死,並且您可能希望它恢復正在執行的操作,這可能是不可能的。

如果您可以將該工作項目轉移到服務中,則Windows服務可能會正常工作。如果工作需要HttpContext,儘管您可能希望有一個Windows服務調用一個web服務來定期執行該呼叫,但這可能並不理想。

0

這很有道理,但只是爲了好玩,如果工作不需要在網站關閉時運行會怎樣?如果它與Application_Start事件關聯,並且只需要在人們瀏覽網站時運行,那麼此時的風險是什麼?

好的答案,我只是好奇一點,關於如何在內部工作。

0

我會建議你設置一個計劃任務來在你的網站上運行一個頁面。我通常計劃任務具有以下指向一個.vbs文件:

 
On Error Resume Next 
Dim objRequest 
Dim URL 

Set objRequest = CreateObject("Microsoft.XMLHTTP") 
URL = "http://www.mywebsite.com/cron/pagetorun.ashx" 

objRequest.open "POST", URL , false 

objRequest.Send 

Set objRequest = Nothing