特定时间间隔内的重复性任务?

Ali*_*hşi 5 .net c# asp.net-mvc timer scheduled-tasks

例如,我想以特定的时间间隔(每小时或每日任务)调用一个函数.

我已经在使用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());
}
Run Code Online (Sandbox Code Playgroud)

我以6小时为间隔向db发送天气信息.项目已经在主持人.只要我的计算机本地服务器正在运行,Timer事件就会起作用.

题:

我的代码有什么问题?(或者在WebProject中使用计时器的逻辑错误?)为什么计时器只在本地服务器工作时工作?

管理时间间隔任务的最佳方法是什么?(不需要asp.net)

我希望,我可以解释这个问题.谢谢.

Dar*_*rov 7

计时器停止的原因是因为此计时器在您的ASP.NET应用程序中运行,该应用程序本身托管在Web服务器上.当此服务器停止或回收应用程序时,AppDomain将与您可能已启动的所有线程一起关闭.这就是为什么在ASP.NET应用程序中编写重复的后台任务是一个非常糟糕的主意.菲尔哈克blogged about the dangers.

执行此操作的正确方法是将此代码托管在ASP.NET应用程序之外的单独进程中.这可以是Windows服务或控制台应用程序,它计划使用例如Windows调度程序定期运行.这样,代码可以保证始终运行.