这些变量是垃圾收集的吗?

时间:2012-02-09 17:04:19

标签: c# asp.net global-asax application-start

我正在努力让Quartz.net调度程序工作,但我不知道为什么它不会解雇未来日期安排的工作。我已经测试了一个cron触发器,它每分钟触发一次,它可以工作(工作和所有),所以我知道我的工作代码不是问题。

我尝试过的事情:

  1. 使ISchedulerFactory成为全局静态变量
  2. 使IScheduler成为全局静态变量
  3. 我已在Application_Start的末尾添加了电子邮件通知,因此我知道它何时触发
  4. 每次我更改调度程序代码时,我都会重新启动应用程序并触发我的通知电子邮件,因此我知道它已重新启动。
  5. 我在共享托管环境中运行此程序(不确定这是否会对它产生任何影响)。我的猜测(这只是一个猜测)是垃圾收集的东西,但我不确定是什么和为什么。

    void Application_Start(object sender, EventArgs e) 
    {
        // Code that runs on application startup
        // construct a scheduler factory
        ISchedulerFactory schedFact = new StdSchedulerFactory();
    
        // get a scheduler
        IScheduler sched = schedFact.GetScheduler();
        sched.Start();
    
        // construct job info
        JobDetail jobDetail = new JobDetail("myJob", null, typeof(Recorder));
        jobDetail.JobDataMap["domain"] = "www.mydomain.com";
        jobDetail.JobDataMap["userId"] = "2";
    
        // Create trigger (everything is in UTC!!!)
        CronTrigger cronTrigger = new CronTrigger("Schedule");
        cronTrigger.StartTimeUtc = TriggerUtils.GetEvenSecondDate(DateTime.UtcNow);
        cronTrigger.TimeZone = TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time");  // run in pacific timezone
        cronTrigger.CronExpressionString = "0 30 13 ? * MON-FRI *"; 
    
        sched.ScheduleJob(jobDetail, cronTrigger);
    }
    

1 个答案:

答案 0 :(得分:2)

如果没有请求进入,IIS可以关闭ASP.NET进程,因此不会触发任何代码。

这就是为什么网络应用程序不是类似服务(始终在线)行为的良好来源的原因。

我已经在带有网页/网络服务的网络应用中看到了这一点,该服务可以从外部通过cURL工具进行操作。

如果您对进一步调试感兴趣,请在Application_End中添加一些通知,以确保在计时器触发预定作业之前实际关闭该进程。