Quartz .net утечка памяти

Использую Quartz со своей реализацией JobFactory, в приложении несколько сервисов (включая DataContext EF), подключенных через DI. Объясните, пожалуйста, что нужно сделать в ReturnJob, чтобы у меня не было утечки памяти. Я должен реализовать Dispose на всех уровнях и во всех своих сервисах?


Ответы (1 шт):

Автор решения: Scrzii

Проблема оказалась в том, что IDisposable сервисы не завершаются автоматически. Решается при помощи создания IServiceScope:

public class JobFactory : IJobFactory
{
    private readonly IServiceProvider _serviceProvider;
    private readonly Dictionary<IJob, IServiceScope> _jobScopeMapping = new();

    public JobFactory(IServiceProvider serviceProvider)
    {
        _serviceProvider = serviceProvider;
    }

    public IJob NewJob(TriggerFiredBundle bundle, IScheduler scheduler)
    {
        var scope = _serviceProvider.CreateScope();
        var job = scope.ServiceProvider.GetService(bundle.JobDetail.JobType) as IJob;
        _jobScopeMapping.Add(job, scope);

        return job;
    }

    public void ReturnJob(IJob job)
    {
        if (!_jobScopeMapping.TryGetValue(job, out var scope))
        {
            Console.WriteLine("Mapping for job does not found!");  // Ну здесь, конечно, логгер должен быть
            return;
        }

        _jobScopeMapping.Remove(job);
        scope.Dispose();
    }
}

Взял из своего вопроса

→ Ссылка