例如,我想在特定的时间间隔(每小时或每天的任务)调用一个函数。
我已经在使用计时器了。但只要我的本地服务器正常工作,它就可以工作。例如:
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 小时将天气信息写入数据库。项目已在主机中。只要我的计算机本地服务器正在运行,计时器事件就会起作用。
问题:
我的代码有什么问题吗? (或者在WebProject中使用计时器的逻辑错误?)为什么计时器仅在本地服务器工作时才工作?
管理时间间隔任务的最佳方法是什么? (不需要asp.net)
我希望我能解释这个问题。谢谢。
计时器停止的原因是因为该计时器在您的 ASP.NET 应用程序中运行,而该应用程序本身托管在 Web 服务器上。当该服务器停止或回收应用程序时,AppDomain 以及您可能已启动的所有线程都会关闭。这就是为什么在 ASP.NET 应用程序中编写重复的后台任务是一个非常糟糕的主意。菲尔·哈克
blogged about the dangers
。
执行此操作的正确方法是将此代码托管在 ASP.NET 应用程序外部的单独进程中。这可以是 Windows 服务或控制台应用程序,例如使用 Windows 调度程序安排定期运行。这样可以保证代码始终运行。
我的建议是创建一个使用计时器的Windows服务,或者创建一个普通的应用程序并创建一个计划任务以在您需要的时间间隔运行它。这篇 StackOverflow 帖子可能对您有帮助:
您可以禁用您的 ASP.NET 应用程序所属的应用程序池的回收。对于 .Net 而言,内存泄漏很少见,因此大多数时候您可以信赖
GC
。这也将消除回收后的预热并几乎不费力地改善用户体验。
另一个好的解决方案是创建控制台应用程序并在窗口中安排它“
Task Scheduler
”。您将有很好的UI
来管理何时以及如何跑步。维护此类任务比“Windows Service
”容易得多,并且需要编写更少的代码。