9

メールを作成して送信するためのWindowsサービスを作成しました。RazorEngineを使用してメールテンプレートを解析しています。モデルを作成するために動的ExpandoObjectを使用しています。

私の問題は、各電子メールが作成されて送信されるときにメモリが増加しているが、解放されないことです。Antsメモリプロファイラーを使用してサービスのプロファイリングを行いました(これまで使用したことはありません)が、次の結果が表示されます。

Razorエンジンを使用

Razor.Parse(text、model)を使用して200通の電子メールを解析する

ジェネレーション1:12.9kb

ジェネレーション2:15.88mb

ラージオブジェクトヒープ:290.9kb

.NETに割り当てられた未使用のメモリ:3.375mb

管理されていない:69.51mb

メモリフラグメントの総数:197

かみそりエンジンなし

解析されていないテキストを200通の電子メールで返します。

ジェネレーション1:13.87kb

ジェネレーション2:3.798mb

ラージオブジェクトヒープ:95.58kb

.NETに割り当てられた未使用のメモリ:4.583mb

管理されていない:44.58mb

メモリフラグメントの総数:7

Razorの最大の第2世代インスタンスは次のとおりです。

System.Reflection.Emit __FixUpData []-2,447,640ライブバイト、3,138インスタンス

オブジェクトがリリースされず、ジェネレーション2が成長している理由を誰かが知っていますか?テンプレートを解析するたびにRazorEngineの新しいインスタンスを作成する方法はありますか?テンプレートが終了すると、テンプレートは参照されず、GCに移動します。

テンプレートを解析するたびにテンプレートサービスの新しいインスタンスを作成しようとしましたが、これは違いを生みませんでした

using (ITemplateService templateService = new TemplateService())
{
     result = templateService.Parse<ExpandoObject>(text, model);
}
4

4 に答える 4

2

テンプレートを解析するたびに、RazorEngineはメモリ内のアセンブリをコンパイルします
それは高くつく可能性があります。

テンプレートは可能な限り再利用する必要があります。

于 2012-09-06T13:47:05.323 に答える
2

古い質問ですが、テンプレート キャッシュを有効にするには、Parse メソッドに「キャッシュ」引数を指定する必要があります (テンプレートへのパスにすることができます/する必要があります)。

return RazorViewService.Parse(File.ReadAllText(path), model, null, cache);
于 2014-03-26T18:03:32.583 に答える
1

同じテンプレートを繰り返し使用している場合は、RazorEngine.Compile を 1 回呼び出してから Razor.Run を呼び出して、テンプレートが 1 回だけコンパイルされるようにします。

また、ビルドで DEBUG が有効になっていると、RazorEngine がメモリをリークしているように見えると思います。製品コードがリリース プロファイルを使用して、つまり DEBUG コンパイラ定数を使用せずにビルドされていることを確認してください。

于 2014-10-08T01:33:00.437 に答える
0

テンプレートをコンパイルすると、作成された動的アセンブリが現在の appdomain に読み込まれます。それらをアンロードする機能がないため、より多くのテンプレートをコンパイルすると、メモリが増え続けます。

これを回避するには、RazorEngine 3.x で IsolatedTemplateService を使用できます。それは、コンパイルされたテンプレートを新しい appdomain にロードすることです。そのアプリ ドメインがガベージ コレクションされると、そのアプリ ドメインに読み込まれたテンプレート アセンブリも収集されます。ただし、動的モデル (Expando オブジェクト) や匿名モデルを使用できないなど、いくつかの制限があります。また、モデルはシリアライズ可能である必要があります。

RazorEngine の作者からこれをチェックしてください: http://www.fidelitydesign.net/?p=473

于 2012-10-06T23:18:20.070 に答える