我正在尝试使用Scheduled Job
实现System.Threading
。
我的代码第一次正确运行并将日志存储在数据库中,但是在时间间隔之后定时器没有回调。
我正在关注链接上的示例 [示例] http://dhavalupadhyaya.wordpress.com/2008/08/30/how-to-create-scheduled-jobs-in-net-web-applications/
我的实施如下:
public sealed class Jobs
{
public Jobs() { }
public static void HourlyJob(object state)
{
SchedularDBContext schedular = new SchedularDBContext();
DBSchedulars dbSchedular = new DBSchedulars();
dbSchedular.Message = "Generated time span = " + DateTime.Now.ToString();
schedular.DbSchedulars.Add(dbSchedular);
schedular.SaveChanges();
}
}
public sealed class Schedular
{
public Schedular() { }
public void Schedular_Start()
{
TimerCallback callbackHourly = new TimerCallback(Jobs.HourlyJob);
Timer hourlytimer = new Timer(callbackHourly, null, TimeSpan.Zero,TimeSpan.FromMinutes(1.0));
}
}
我在global.ascx中将其称为
protected void Application_Start(object sender, EventArgs e)
{
CodeFiles.Schedular objSchedular = new CodeFiles.Schedular();
objSchedular.Schedular_Start();
}
但是计时器在没有运行之后第一次运行。我想让它在每分钟后运行。它有什么不对?我怎么能让它在每分钟后自动运行?
答案 0 :(得分:1)
你遇到了处理计时器的问题 - 你的objSchedular
在执行Application_Start
后没有在任何地方被引用,而且你的Schedular
实例内部也没有引用.NET { {1}}对象。因此垃圾收集器将您的对象视为垃圾,因为没有找到对这些对象的引用,因此在GC循环期间处理计时器
我建议阅读Richter's CLR via C#“垃圾收集和调试”,他用Timer对象显示这个陷阱。
因此,将Timer
作为字段存储在其中,并在其中存储objSchedular
变量作为字段,这将解决您的问题。
答案 1 :(得分:1)
快速回答是,您需要将对象设置为静态,并将其声明在其他位置,而不是在Application Start中。在应用程序启动时,您只需要调用objSchedular.Schedular_Start();
CodeFiles.Schedular static objSchedular = new CodeFiles.Schedular();
答案 2 :(得分:0)
关于维护Timer对象的范围
2个选项
将Timer
对象传递给" Shceduler
"的构造函数上课和使用
它
如果您需要在" Timer
"中创建多个Shceduler
个对象类,创建List<Timer>
并将传递给Scheduler Class的构造函数。 将新创建的Timer
对象添加到此列表。但是一旦你不需要它们,请确保从列表中释放计时器。