gpt4 book ai didi

c# - RazorEngine 取消缓存已编译的模板

转载 作者:可可西里 更新时间:2023-11-01 08:08:21 24 4
gpt4 key购买 nike

目前,我正在使用 RazorEngine v2.1 作为发送模板化电子邮件(数千封)的后台进程的一部分。为了加快速度,模板以其 md5 和作为名称进行编译。这样一来,当模板更改时,它会被重新编译,并且使用该模板的所有电子邮件都能够使用相同的编译模板。我在列表中跟踪已编译模板的名称,以便我知道何时再次调用编译(并做一些其他事情)。

问题:我突然想到,经过很长时间和大量模板修改后,所有这些缓存的编译模板可能仍然在内存中,因为它们看起来像是被存储了在动态中。对于这个可能一次运行数月而不重新启动的特定进程,如果所有以前版本的模板仍然存在,这可能会构成严重的内存泄漏。

问题:有没有一种方法可以取消缓存旧模板,使它们不再停留在动态中?

例如,如果我能够自己保留已编译的模板对象,并在我想使用它们时将它们传递给 RazorEngine,我就可以决定何时丢弃它们,这将消除内存泄漏。但是,如果 RazorEngine 已经有办法解决这个问题,那么了解它也会很方便,因为我在互联网上找不到很多关于这个特定问题的引用资料。关于为什么应使用编译模板来减少内存使用的原因有很多,但我很难找到任何关于长期应用程序中累积的大量未使用编译模板的信息。

编辑:我刚刚阅读了一些有关缓存如何工作的内容,如果使用不同的模板传入相同的名称,它将重新缓存它并丢弃旧的。然而,这里的问题仍然存在,因为随着时间的推移,电子邮件将被添加和删除,并且随着时间的推移,所有旧的已删除电子邮件仍然存在(即使它不会存储模板的每个版本的副本)。

最佳答案

回答这个问题是因为它对某些人来说似乎仍然相关。( https://github.com/Antaris/RazorEngine/issues/232#issuecomment-128802285 )

For this particular process, which might run for months at a time without a restart, this could constitute a serious memory leak if all the previous versions of templates are still hanging around.

当您更改和重新编译模板时,您会发生内存泄漏,因为您无法卸载已加载的程序集(RazorEngine 在后台为您编译和加载)。

真正释放内存的唯一方法是重新加载 AppDomain 或重新启动进程。

其他答案似乎谈论的是较新的版本,这些版本可以防止默认配置中的内存泄漏(让您意识到这个问题),并且需要一些自定义配置才能使用另一个模板代码重新编译 key 。请注意,所有其他答案实际上都会增加内存消耗!

马蒂德, 一个 RazorEngine 贡献者

关于c# - RazorEngine 取消缓存已编译的模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14369614/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com