我正在使用TopShelf(基于C#.NET 4.6.1中的控制台应用程序)运行Windows服务,并且正在使用Automapper 9.0.0。我每隔10秒运行一个任务,该任务处理一个Ms SQL数据库(使用实体框架)中的约1000行,似乎Automapper占用了大量内存,并且每次任务运行时内存都会增加(在任务管理器中,可以看到该服务占用了超过3000 Meg的RAM ++。
我是Automapper的新手,现在不需要任何代码来手动释放内存。在某个地方,我看到了大量的处理程序,我想知道Automapper是否生成这些处理程序,以及如何清理它们。
我尝试在每个任务的末尾放置一个 GC.Collect(),但似乎没有什么不同
这是我的任务的代码摘录:
private void _LiveDataTimer_Elapsed(object sender,ElapsedEventArgs e)
{
// setting up Ninject data injection
var kernel = new StandardKernel();
kernel.Load(Assembly.GetExecutingAssembly());
//var stationExtesions = kernel.Get<IStationExtensionRepository>();
//var ops = kernel.Get<IOPRepository>();
//var opExtensions = kernel.Get<IOPExtensionRepository>();
//var periods = kernel.Get<IPeriodRepository>();
//var periodExtensions = kernel.Get<IPeriodExtensionRepository>();
// create the LiveDataTasks object
//var liveDataTasks = new LiveDataTasks(stationExtesions,ops,opExtensions,periods,periodExtensions);
// sync the station live data
//liveDataTasks.SyncLiveStationData();
// force garbage collection to prevent memory leaks
//GC.Collect();
Console.WriteLine("LiveDataTimer: Total available memory before collection: {0:N0}",System.GC.GetTotalMemory(false));
System.GC.Collect();
Console.WriteLine("LiveDataTimer: Total available memory collection: {0:N0}",System.GC.GetTotalMemory(true));
}
MOFICATIONS:我在显示使用的TotalMemory的代码的末尾添加了一些控制台输出。我删除了GC.Collect()
,因为它没有任何改变,并注释掉了大多数访问数据库的代码。现在我意识到kernel.Load(Assembly.GetExecutingAssembly());
已经使内存增长非常快。请参见以下控制台捕获:
现在,如果我注释掉kernel.Load(Assembly.GetExecutingAssembly());
,我将再次获得稳定的记忆状态。我如何处置或卸载内核???