Quartz.net核心中的内存消耗问题

时间:2019-05-28 13:16:29

标签: c# quartz-scheduler quartz.net

我在应用程序中使用 Quartz.NET 3.0.7 来执行某些计划任务,但是当我启动计划程序时,它将在运行计划程序时增加内存。我还检查了简单的计划任务,并打印了一些列表控制台上的字符串错误也发生了。我也无法理解实际的问题。我的观察是完成工作后释放了 IJob 对象。 / p>

2 个答案:

答案 0 :(得分:0)

您可能要开始运行一些性能计数器,以监视CPU使用率和内存统计信息,并了解发生了什么情况。

如果那不能导致您得到任何明显的答案,那么该开始配置文件了。

答案 1 :(得分:0)

我猜您的服务定位器请求的服务在使用后没有释放。您可以通过在所请求的服务之一中实现IDisposable接口来进行检查,并验证是否调用了Dispose()。我想不是。

要解决此问题,您可以将服务注册为作用域,然后手动打开作用域。这样可以确保所有服务在使用后都被处置。

public async Task Execute(IJobExecutionContext context)
{
    // this check is superfluous and can be omitted. 
    // if you want to ensure that the service locator is there, check this in the constructor.
    // with a good DI framework, it can't be null.
    if (this.serviceProvider != null)
    {
        // open the scope and dispose it after use.
        using (var serviceScope = host.Services.CreateScope())
        {
            // get the service locator from the scope.
            var services = serviceScope.ServiceProvider;

            try
            {                   
                JobKey jobKey = context.JobDetail.Key;
                IEmailScheduleSendService emailScheduleSendServiceNew = services.GetRequiredService<IEmailScheduleSendService>();
                ILogger<EmailJob> logger = services.GetRequiredService<ILogger<EmailJob>>();
                logger.LogDebug($"FROM EXECUTE METHOD | {jobKey.Name} | {jobKey.Group} | START");
                await emailScheduleSendServiceNew.EmailScheduleSendAsync(context);
                logger.LogDebug($"FROM EXECUTE METHOD | {jobKey.Name} | {jobKey.Group} | END");
            }
            catch (Exception ex)
            {
                logger.LogDebug($"SOMETHING WENT WRONG!");
            }
        }
    }        
}