メールを作成して送信するための Windows サービスを作成しました。依存性注入を実装し、Autofac を DI コンテナーとして使用しています。
私の問題は、サービスが実行されると、割り当てられたメモリが増え続け、現時点では 1GB を超えていることです。ライフタイムに関するこの記事を読み 、コンテナから直接解決するのではなく、これから BeginLifetimeScope を組み込みました。しかし、これで問題は解決していません。アドバイスをいただければ幸いです。
以下は、私のサービス onStart メソッドにある Autofac 構成です。
ContainerBuilder builder = new ContainerBuilder();
//Register the Database context
builder.RegisterType<DbContainer>().As<IDbContainer>();
//Register a single shared instance of Email Manager which will be shared by all EmailProcessing instances
builder.Register(c => new EmailManager()).As<IEmailManager>()).SingleInstance();
//Register email processing classes
builder.Register(c => new EmailBuilder(c.Resolve<IDbContainer>(), c.Resolve<IEmailManager>())).As<IEmailBuilder>();
_container = builder.Build();
以下は、5 秒ごとに実行される電子メール タイマー メソッドです。
private void EmailTimerElapsed(object sender, System.Timers.ElapsedEventArgs e)
{
using (var lifetime = _container.BeginLifetimeScope())
{
//Builder, and any of its disposable dependencies, will
//be disposed of when the using block completes
IEmailBuilder builder = lifetime.Resolve<IEmailBuilder>();
//Execute the process emails method
builder.ProcessEmails();
}
emailTimer.Start();
}
EmailManager の同じインスタンスをすべての電子メール タイマーの反復で使用したいが、それ以外はすべて新しいインスタンスを使用したい。
編集
EmailBuilder とそのすべての依存関係が破棄され、GC の準備が整っているかどうかを確認する方法はありますか?
私のオブジェクトの多くは Generation2 に入り、保持されています。ライフタイムが完了したときにそれらを破棄するべきではありませんか?