簡體   English   中英

Asp.net中的全局計時器

[英]Global Timer in Asp.net

我想有一個ASP.net應用程序的計時器,它將在每個星期天晚上啟動並執行某些操作(更新數據庫中的表)。 但是,除了Web應用程序之外,我真的不想編寫必須部署在服務器上的服務。 有沒有辦法輕松實現這一目標? 也許使用Global.asax文件?

似乎最好的解決方案是使用這種技術 如果我對服務器有更多控制權,我可能會編寫一個控制台應用程序來利用計划任務。

我不是100%肯定你會把它放在哪里 ,但使用System.Threading.Timer會搖滾這個。

// In some constructor or method that runs when the app starts.
// 1st parameter is the callback to be run every iteration.
// 2nd parameter is optional parameters for the callback.
// 3rd parameter is telling the timer when to start.
// 4th parameter is telling the timer how often to run.
System.Threading.Timer timer = new System.Threading.Timer(new TimerCallback(TimerElapsed), null, new Timespan(0), new Timespan(24, 0, 0));

// The callback, no inside the method used above.
// This will run every 24 hours.
private void TimerElapsed(object o)
{
    // Do stuff.
}

最初,您必須確定何時第一次啟動計時器,或者您可以在周日晚上運行此計時器時打開網站。

但正如其他人所說,使用網站以外的東西來做這件事。 制作Windows服務來處理這個問題很容易。

我會編寫一個控制台應用程序並使用計划任務來安排它。

嘗試使用Quartz .NET ,.NET .NET企業應用程序(如ASP .NET)的作業調度程序,這應該可以滿足您的需求。

我認為.NET應用程序不是解決問題的好方法。

IIS Recycling將每隔幾個小時回收一次該進程(具體取決於設置),即使您將該時間間隔設置為7天,應用程序池仍可以由於您無法控制的其他原因而被回收。

我同意jcrs3:只需編寫一個小控制台應用程序並使用調度程序。 您也可以編寫服務,但如果您需要快速簡便的東西,請使用控制台應用程序。

回應您對計划任務的評論:

另一個hack是覆蓋Global.asax中的一個事件,這個事件通常像Application_EndRequest()一樣被調用,並做類似於:

protected void Application_EndRequest()
{
    if (((DateTime)Application["lastTimeRun"]) < DateTime.Today)
    {
        Application["lastTimeRun"] = DateTime.Today;
        doSomething();
    }
}

這將在更改日期后的第一個請求之后運行,因此您無法保證每天早上凌晨3:00准確運行。

我甚至會在另一台計算機上使用計划任務來訪問網站。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM