【问题标题】:Automatically invoking operations/actions自动调用操作/动作
【发布时间】:2010-02-07 20:05:35
【问题描述】:

我们需要在特定时间向我们的用户发送简报/消息。这是在网上完成的;但是,我们希望这在一定时间内自动完成。虽然这个问题适合 Window Service 类型的模型,但我们是在公共域上托管;因此,我们不能使用此选项。

有什么方法可以在 web.config 中的配置中指定的某个点(时间)自动调用此特定操作。

目前这是通过管理面板手动调用操作来完成的。

平台 - ASP.NET 3.5
语言 - C#

【问题讨论】:

标签: c#


【解决方案1】:

有一个简单的解决方案可以“每 X 个时间单位”做一些事情。虽然这不是完全您正在寻找的,但实现起来非常简单,因此这可能是一个合适的解决方法。 (您可以每 X 分钟启动一个任务,如果当前时间在某个给定的时间窗口内,它会做一些工作。)

https://blog.stackoverflow.com/2008/07/easy-background-tasks-in-aspnet/

主要思想是这个(引用自那个链接):

  1. 在启动时,向 HttpRuntime.Cache 添加一个具有固定过期时间的项目。
  2. 当缓存项过期时,做你的工作,例如 WebRequest 或你有什么。
  3. 将项目重新添加到具有固定过期时间的缓存中。

顺便说一句,这种技术 在 Stackoverflow 上用于徽章分配。 :-)

【讨论】:

  • 它看起来很厚颜无耻的想法和感染这似乎是我问题的解决方案。让我验证一下。
  • 这就解释了为什么徽章分配如此不稳定。 :p
  • 徽章分配不再使用这种技术(尽管它曾经确实如此 - 请参阅 Jeff Atwood 2 月 12 日对该博客主题的评论)。
【解决方案2】:

可以使用System.Threading.Timer 执行此操作,但您必须非常小心如何操作。如果您像在 Windows 服务中一样投入计时器,您可能会遇到各种问题。 Windows 服务只要运行就一直存在,并且是单线程的,除非您将其设为多线程; ASP.NET AppDomain 两者都不是。

This article 有一些关于如何正确保护计时器的好信息。要点是:

  • 您需要序列化计时器调用 - 不允许在回调中重新进入,如果一个回调已经在运行,则跳过下一个;

  • 如果 AppDomain 被卸载,您必须正确处理计时器,这可能由于多种不同的原因而发生。

所以继续在您的Application_Start 方法中使用System.Threading.Timer,但请注意这些问题并在代码中编写适当的保护措施。

【讨论】:

    【解决方案3】:

    这是在 ASP.NET 应用程序中使用计时器的示例。您可以在计时器触发后检查(或缓存过期,如果您使用该选项)并查看您是否已超过 web.config 中调用事件的时间。

    http://www.eggheadcafe.com/tutorials/aspnet/223319d8-6366-492a-8eae-e3c7a26c88a4/refreshing-aspnet--cache.aspx

    Global.asax 代码(需要注册 System.Threading.Timer):

    public class Global : HttpApplication
    {
        private static Timer timer;
        private int interval = 60000*5; // five minutes
    
    
        protected void Application_Start(object sender, EventArgs e)
        {
            if (timer == null)
            {
                timer = new Timer(new TimerCallback(ScheduledWorkCallback), HttpContext.Current, interval, interval);
                ScheduledWorkCallback(HttpContext.Current);
            }
        }
    
    
        public static void ScheduledWorkCallback(object sender)
        {
            //do your work here
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-13
      • 1970-01-01
      • 1970-01-01
      • 2011-07-15
      • 1970-01-01
      • 1970-01-01
      • 2019-06-16
      相关资源
      最近更新 更多