我需要一个 IHostedService 或“Worker Service”,但我遇到了一个有趣的难题,那就是垃圾收集器没有在“适当的”时间运行。相反,它只是不收集任何资源,导致应用程序的内存使用量增加,(在调试期间,根本没有发生 GC)。
我已经做了所有可以想到的事情,包括让我的所有任务都返回一些值,并尽可能使用 using 语句。还使用依赖注入抽象了几层,(以确保有多个位置应该与运行时通信,以表明它适合运行垃圾收集。
我唯一不是解决方案的“解决方案”是手动运行 GC.Collect();
namespace Worker
{
public class Worker : BackgroundService
{
private readonly ILogger<Worker> _logger;
public Worker(ILogger<Worker> logger)
{
_logger = logger;
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
while (!stoppingToken.IsCancellationRequested)
{
_logger.LogInformation($"Worker running at: {DateTime.Now}");
var files = Directory.EnumerateFiles(@"C:\\repos\");
var date = files.Select(f => File.ReadAllBytesAsync(f));
GC.Collect();
}
}
}
}
结果是我的代码在没有手动触发 GC 的情况下会膨胀以最大化可用内存,但是,使用手动 GC 这可以运行数小时而不会显着改变资源使用情况
解决方案 使用本文中提到的设置:https ://dotnet.github.io/orleans/1.5/Documentation/Deployment-and-Operations/Configuration-Guide/Configuring-.NET-Garbage-Collection.html (已弃用)
更新链接:https ://docs.microsoft.com/en-us/dotnet/core/run-time-config/garbage-collector