5

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

我已经在使用定时器了。但只要我的本地服务器正常工作,它就可以工作。例如:

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 小时将天气信息写入 db。项目已经在主机中。只要我的计算机本地服务器正在运行,计时器事件就会起作用。

问题:

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

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

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

4

3 回答 3

7

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

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

于 2012-11-30T15:12:14.133 回答
2

我的建议是创建一个使用计时器的 Windows 服务,或者创建一个普通的应用程序并创建一个计划任务以在您需要的时间间隔内运行它。这篇 StackOverflow 帖子可能会对您有所帮助:

Windows 服务和计时器

于 2012-11-30T15:09:28.533 回答
0

您可以为您的 asp.net 应用程序所属的应用程序池禁用回收。GC.Net 很少发生内存泄漏,因此您大部分时间都可以依赖它。这也将消除回收后的预热并几乎不费吹灰之力地改善用户体验。

另一个好的解决方案是创建控制台应用程序并将其安排在 Windows“ Task Scheduler”中。您将很高兴UI管理何时以及如何运行。维护这样的任务比“ Windows Service”容易得多,并且需要编写更少的代码。

于 2013-12-31T12:09:30.997 回答