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();
}
}