C# Hangfire 1.7.8服务Dotnetcore 3.1内存使用率高,有许多TimerQueueTimer实例

C# Hangfire 1.7.8服务Dotnetcore 3.1内存使用率高,有许多TimerQueueTimer实例,c#,.net-core,windows-services,hangfire,C#,.net Core,Windows Services,Hangfire,我有一个用DotnetCore 3.1和Hangfire 1.7.8编写的服务。 我看到异常高的内存使用率,大部分内存被TimerQueueTimer对象占用,尽管我没有显式初始化任何计时器 由于我最初是在Dotnetcore 2.2中创建的,因此它使用的是旧的服务结构,如下所示: internal class HangFireService : ServiceBase { } 在服务启动时以及任务完成时添加的作业如下所示: if(!_hangfireHelper.GetJobs(typeof

我有一个用DotnetCore 3.1和Hangfire 1.7.8编写的服务。 我看到异常高的内存使用率,大部分内存被TimerQueueTimer对象占用,尽管我没有显式初始化任何计时器

由于我最初是在Dotnetcore 2.2中创建的,因此它使用的是旧的服务结构,如下所示:

internal class HangFireService : ServiceBase
{
}
在服务启动时以及任务完成时添加的作业如下所示:

if(!_hangfireHelper.GetJobs(typeof(GenericTask), taskName).Any())
            {
                BackgroundJob.Schedule<GenericTask>(d => d.RunTask(null), TimeSpan.FromMinutes(5));
            }
if(!\u hangfireheloper.GetJobs(typeof(GenericTask)、taskName.Any())
{
BackgroundJob.Schedule(d=>d.RunTask(null),TimeSpan.FromMinutes(5));
}

如何减少计时器的使用?

最终证明与Hangfire无关,但高内存使用率的根本原因是Serilog

我创建了一个虚拟日志类,并将其注入到我的所有服务和所有TimerQueueTimer对象中。下面是另一个memoryprofiler图像:

Serilog的使用情况如下:

public Logger Logger()
       {

            var log = new LoggerConfiguration()
                .ReadFrom.Configuration(_configuration)
                .CreateLogger();
            return log;
        }
用法:

using( var log = Logger())
{
   log.LogInformation(...)
}

不知何故,serilog没有处理计时器对象…

Hi!Serilog
Logger
s应该是有效的单例-为每个日志事件创建和初始化整个日志管道是非常昂贵的。虽然Serilog通常会处理它所使用的资源,但底层系统可能需要一些时间才能完全清理其中的一些资源。是的,我知道,但它在不处理计时器的情况下从75MB增长到1,2GB。。。删除Serilog并添加my light sql logger它将原来的75 MB内存保留了几天。您正在使用的某个接收器可能有问题-需要进一步调查。不过,仍然强烈建议使用singleton
Logger
s。