2011-08-05 53 views
0

我用ASP .NET MVC 3,用於創建網頁,我需要在我的Global.asax.cs文件中的每個20分鐘後更改數據庫的東西......我 設置定時器。下面是代碼C#Timer未正常工作

protected void Application_Start() 
{ 
    AreaRegistration.RegisterAllAreas(); 

    RegisterGlobalFilters(GlobalFilters.Filters); 
    RegisterRoutes(RouteTable.Routes); 
    Unit = new UnitOfWork(); 
    System.Timers.Timer timer = new System.Timers.Timer(); 
    timer.Interval = 1200000; //20 minutes 
    timer.Elapsed += new System.Timers.ElapsedEventHandler(Elapsed); 
    timer.Start(); 
} 

void Elapsed(object sender, System.Timers.ElapsedEventArgs e) 
{ 
    Unit.Srvc.UpdateUserActivity(); 
} 

我現在運行的今天,什麼是貝蒂,它只能一次...... 20分鐘後,將其更改數據庫和它的所有。

P.S.Yesteday我在20秒內測試,它工作正常。但是,今天它不想在20分鐘內正常工作。謝謝你的幫助。

P.S.2我用存儲過程更新數據庫。

PS3剛纔我發現它隨機工作:D在5:32Am我運行程序...它工作在5:52Am,不工作在6:12Am,現在工作(現在是6 :49,我不知道它什麼時候工作)。

回答

4

最有可能的原因是您的AppDomain由於關閉不活動,這意味着整個應用程序沒有運行。我認爲,空閒超時是20分鐘不活動。

看到這個問題:

How to keep ASP.NET assemblies in AppDomain alive?

+0

我只是在本地主機測試了它......而應用程序是活躍;-) –

+2

+1 - 同意這是有可能的問題。但是我會考慮是否真的想要這樣做,並且顛覆IIS的正常行爲,以幫助您提高應用程序和服務器的性能和可靠性。 – Reddog

0

你可能會發現你的線程(從IIS應用程序池)被回收或關閉。用於請求 - 響應處理,而不是這種類型的行爲時

的Web應用程序通常最好的工作。目前還不清楚你在做什麼,但假設你正在使用SQL Server,也許你可以看看維護任務或觸發器,如果​​它涉及非規範化數據(即捲起計算的數據)。如果它涉及在請求 - 響應過程中收集的數據,那麼您可能會考慮使用Web緩存和一些針對延遲持久性的緩存過期操作。

0

我的猜測是太會話簡單到期,但我想補充一點額外的費用。

閱讀代碼我想(再次)你在數據庫中將用戶標記爲「不活躍」或斷開連接或類似的東西。如果是這樣,不使用定時器來做到這一點,相反,set the session expiration(當用戶不發送在一定時間內的任何請求)所需的時間,並把代碼要在在the Session_OnEnd handler

1
恰好運行

對我來說,它看起來像你的計時器將被垃圾收集殺死,因爲你沒有在它從Application_Start超出範圍後保留它的引用。嘗試添加:

Application["Whatever"] = timer;