首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RazorEngine内存使用

RazorEngine内存使用
EN

Stack Overflow用户
提问于 2012-09-06 13:45:18
回答 4查看 4.3K关注 0票数 9

我创建了一个windows服务来构建和发送电子邮件。我正在使用剃须刀发动机来解析电子邮件模板。我正在使用一个动态ExpandoObject来创建模型。

我的问题是,当每封电子邮件被创建和发送时,内存正在增加,但它从未被释放。我用Ant内存分析器对该服务进行了描述(我以前没有使用过它),但是它显示了以下结果:

带有Razor Engine的

用Razor.Parse解析200封电子邮件(文本、模型)

第1代: 12.9kb 第二代:15.88mb 大对象堆: 290.9kb 分配给.NET的未使用内存: 3.375mb 非托管: 69.51mb 内存碎片总数: 197

无Razor引擎

返回200封未解析的电子邮件。

第1代: 13.87kb 第二代: 3.798mb 大对象堆: 95.58kb 分配给.NET的未使用内存: 4.583mb 非托管: 44.58mb 内存碎片总数:7

对于Razor,最大的第2代实例是:

System.Reflection.Emit __FixUpData[] -2,447,640个活字节,3,138个实例

有没有人知道为什么对象不被释放,第二代正在增长?是否有一种方法可以在每次解析模板时都有一个新的RazorEngine实例,当它完成时,它将不会被引用,并且会转到GC。

每次解析模板时,我都尝试创建一个新的模板服务实例,但这并没有起到什么作用。

代码语言:javascript
复制
using (ITemplateService templateService = new TemplateService())
{
     result = templateService.Parse<ExpandoObject>(text, model);
}
EN

回答 4

Stack Overflow用户

发布于 2012-09-06 13:47:05

每次解析模板时,RazorEngine都会编译内存中的程序集.

可能会很贵。

您应该尽可能多地重用您的模板。

票数 2
EN

Stack Overflow用户

发布于 2014-03-26 18:03:32

老问题,但是要激活模板缓存,必须向Parse方法提供" cache“参数(它可以/应该是模板的路径):

代码语言:javascript
复制
return RazorViewService.Parse(File.ReadAllText(path), model, null, cache);
票数 2
EN

Stack Overflow用户

发布于 2014-10-08 01:33:00

如果您使用同一个模板,重复调用RazorEngine.Compile一次,那么在那里之后调用Razor.Run,以确保只编译一次模板。

此外,我相信当在构建中启用调试时,RazorEngine似乎会泄漏内存。确保您的产品代码是使用发行配置文件构建的,即没有调试编译器常量。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12301515

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档