【问题标题】:Repetitive tasks in specific time intervals?特定时间间隔内的重复性任务?
【发布时间】:2012-11-18 19:41:13
【问题描述】:

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

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

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)

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

【问题讨论】:

  • 你真的需要在 ASP.NET 应用程序中这样做吗?您是否考虑过创建 Windows 服务?
  • @RuiJarimba,不需要,我也问过。 What is the best way to manage time interval tasks?。抱歉,我更新了问题。

标签: c# .net asp.net-mvc timer scheduled-tasks


【解决方案1】:

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

Windows service and timer

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-02-15
        • 1970-01-01
        • 1970-01-01
        • 2010-11-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多