使用System.Threading安排工作?

时间:2014-08-15 13:17:24

标签: c# asp.net .net multithreading timer

我正在尝试使用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();
        }

但是计时器在没有运行之后第一次运行。我想让它在每分钟后运行。它有什么不对?我怎么能让它在每分钟后自动运行?

3 个答案:

答案 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个选项

  1. Timer对象传递给" Shceduler"的构造函数上课和使用 它

  2. 如果您需要在&#34; Timer&#34;中创建多个Shceduler个对象类,创建List<Timer>并将传递给Scheduler Class的构造函数将新创建的Timer对象添加到此列表。但是一旦你不需要它们,请确保从列表中释放计时器。