Quartz.net causes .NET CLR LocksAndThreads

本文关键字:CLR LocksAndThreads NET causes net Quartz | 更新日期: 2023-09-27 18:02:19

我们一直在使用Quartz.net项目来控制我们的一个windows服务中的计划任务。我们已经使用它一段时间了,现在没有问题,但我们最近注意到一个问题与。net CLR LocksAndThreads。

请参阅这个用c#编写的示例命令行应用程序。

using System;
using Quartz;
using Quartz.Impl;
namespace QuartzMemTest
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Quartz Test");
            Console.WriteLine("-----------");
            Console.WriteLine(Environment.NewLine);

            ScheduleHelper.ScheduleJob(typeof(MyTask), "MyJobName", "MyTriggerName", "0 0/01 * 1/1 * ? *");
            Console.WriteLine("Press any key to exit...");
            Console.ReadKey();
        }
    }

    public class ScheduleHelper
    {
        /// <summary>
        /// Adds a job to the Quartz schedule
        /// </summary>
        /// <param name="job">The Job class which inherits from the Quartz.IJob interface</param>
        /// <param name="jobName">A name to give to the job</param>
        /// <param name="triggerName">A name to give to the trigger</param>
        /// <param name="triggerCronExpression">CRON expression to determine the job run interval</param>
        public static DateTime ScheduleJob(Type job, string jobName, string triggerName, string triggerCronExpression)
        {
            // Start the scheduler to run our ImportOpportunitiesJob
            ISchedulerFactory schedFact = new StdSchedulerFactory();
            IScheduler sched = schedFact.GetScheduler();
            sched.Start();
            // Create an instance of our job
            JobDetail jobDetail = new JobDetail(jobName, null, job);
            // Create a CRON trigger which determines the firing interval
            CronTrigger trigger = new CronTrigger();
            trigger.Name = triggerName;
            trigger.StartTimeUtc = DateTime.UtcNow;
            trigger.CronExpressionString = triggerCronExpression;
            // Add job and trigger to the schedule
            return sched.ScheduleJob(jobDetail, trigger);
        }
    }

    public class MyTask : IStatefulJob
    {
        public void Execute(JobExecutionContext job)
        {
            Console.WriteLine("MyTask: Doing something....");
        }
    }
}

我们注意到,如果我们先启动性能监视器,然后运行上面的示例代码,我们可以看到。net CLR的LocksAndThreads突然开始增加,并继续这样做,直到应用程序停止。我的一个同事第一次注意到这个问题是在我们的一个服务器在资源耗尽后崩溃后。

这是夸脱造成的,还是我在做一些愚蠢的事情?如果是Quartz,我能做什么不同的事情来解决这个问题吗?

Quartz.net causes .NET CLR LocksAndThreads

我们在我参与的一个quartz.net项目中遇到了类似的问题。我们发现,在某些情况下,线程池有时会泄漏资源,并且不能正确地清理自己。我最终实现了一个新的线程池,它具有更好的锁定和作业实际完成时的通知。这为我们解决了这个问题。