C# MVC3中的TimerCallback
我将这段代码简化为每半夜执行一个方法,我有一个共享主机(不可能创建windows时间表),但这不起作用。有什么想法吗C# MVC3中的TimerCallback,c#,asp.net-mvc-3,C#,Asp.net Mvc 3,我将这段代码简化为每半夜执行一个方法,我有一个共享主机(不可能创建windows时间表),但这不起作用。有什么想法吗 protected void Application_Start() { AreaRegistration.RegisterAllAreas(); RegisterGlobalFilters(GlobalFilters.Filters); RegisterRoutes(RouteTable.Routes);
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
ControllerBuilder.Current.DefaultNamespaces.Add("PhotoPremier.Controllers");
var dt = NextAt(new TimeSpan(0, 0, 0)); //
var timer = new Timer(new TimerCallback(callback), HttpContext.Current, dt - DateTime.Now, TimeSpan.FromHours(24));
}
static void callback(Object stateObject)
{
DbLayer.ContestManager cm = new DbLayer.ContestManager();
cm.UpdateAllPhotosInContest();
}
DateTime NextAt(TimeSpan time)
{
DateTime now = DateTime.Now;
DateTime result = now.Date + time;
return (now <= result) ? result : result.AddDays(1);
}
受保护的无效应用程序\u Start()
{
RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
注册地址(RouteTable.Routes);
ControllerBuilder.Current.DefaultNamespaces.Add(“PhotoPremier.Controllers”);
var dt=NextAt(新的时间跨度(0,0,0))//
var timer=new timer(new timer回调,HttpContext.Current,dt-DateTime.Now,TimeSpan.FromHours(24));
}
静态无效回调(对象stateObject)
{
DbLayer.contentmanager cm=新的DbLayer.contentmanager();
cm.updatealphotosincontest();
}
DateTime NextAt(时间跨度时间)
{
DateTime now=DateTime.now;
DateTime结果=现在。日期+时间;
返回(现在这可能是由于共享主机中的IIS设置
默认情况下,IIS配置会在一段时间后关闭应用程序,而没有任何人访问它。此外,IIS每隔几分钟会回收一次应用程序池
除非您能够控制此设置,否则您将很难保持应用程序的活动状态并触发计时器的触发器
为了澄清这种情况并提出其他替代方案,我给您提供以下链接:
我认为唯一的解决方案是使用Quarts.Net框架
是非常简单的,在这里有一个简单的代码
public class DailyJob : IJob
{
public DailyJob() { }
public void Execute( JobExecutionContext context )
{
try {
DbLayer.ContestManager cm = new DbLayer.ContestManager();
cm.UpdateAllPhotosInContest();
} catch( Exception e ) {
//Handle this please
}
}
public static void ScheduleJob( IScheduler sc )
{
JobDetail job = new JobDetail("FinishContest", "Daily", typeof(DailyJob));
sc.ScheduleJob(job, TriggerUtils.MakeDailyTrigger("trigger1", 0, 0));
sc.Start();
}
}
//Global.asax
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
/* HERE */ DailyJob.ScheduleJob(new StdSchedulerFactory().GetScheduler());
}
当我最近尝试做同样的事情时,我发现我的问题是在某个地方声明它被垃圾收集的计时器对象。如果你让计时器成为类的成员,而不是在Application_Start中本地声明它,我认为原始海报的代码会起作用
希望这对其他人有所帮助。您的代码仅在有人正在积极使用网站时运行。如果午夜没有人在网站上,那么您的代码将不会运行。我认为此代码不会停止!或者不会停止?我如何编写此代码?当工作进程被回收时,代码将停止,这种情况会在不同的时间发生。它不会再次启动,直到其他用户已登录。