我们需要在特定时间向我们的用户发送简报/消息。这是在网上完成的;但是,我们希望在一定时间内自动完成此操作。虽然这个问题适合Window Service类型,但我们在公共领域托管;因此,我们不能使用此选项。
是否有任何方法可以在web.config中的配置中指定的某个时间点(时间)自动调用此特定操作。
目前,这是通过管理面板手动调用操作来完成的。
平台 - ASP.NET 3.5
语言 - C#
答案 0 :(得分:2)
有一个简单的解决方案来做“每X个时间单位”的东西。虽然这不是完全您正在寻找的东西,但它实现起来非常简单,因此这可能是一个合适的解决方法。 (你可以每隔X分钟开始一个任务,如果当前时间在某个给定的时间窗口内,它会有效。)
http://blog.stackoverflow.com/2008/07/easy-background-tasks-in-aspnet/
主要思想是这个(引自该链接):
- 启动时,将一个项目添加到HttpRuntime.Cache并保持有效期。
- 当缓存项目到期时,请完成您的工作,例如WebRequest或您有什么。
- 使用固定的到期时间将项目重新添加到缓存中。
醇>
顺便说一句,这个技术是 用于在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中的时间来调用您的事件。
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
}
}