自动调用操作/操作

时间:2010-02-07 00:44:54

标签: c#

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

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

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

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

3 个答案:

答案 0 :(得分:2)

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

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

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

  
      
  1. 启动时,将一个项目添加到HttpRuntime.Cache并保持有效期。
  2.   
  3. 当缓存项目到期时,请完成您的工作,例如WebRequest或您有什么。
  4.   
  5. 使用固定的到期时间将项目重新添加到缓存中。
  6.   

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

答案 1 :(得分:1)

可以使用System.Threading.Timer执行此操作,但您必须非常小心如何执行此操作。如果只是像在Windows服务中那样投入计时器,就会遇到各种各样的问题。只要Windows服务正在运行,它就处于活动状态,除非你使它成为多线程的,否则它是单线程的。 ASP.NET AppDomain既不是。

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

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

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

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

答案 2 :(得分:0)

这是在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
    }
}
相关问题