我創建了一個windows服務來構建和發送電子郵件。我已經實現了依賴注入,我使用Autofac作爲DI容器。Autofac垃圾回收 - BeginLifetimeScope
我的問題是,隨着服務的運行,分配的內存不斷增加,目前超過1GB。 I read this article about lifetimes 從這裏我加入了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並被保留。在生命週期完成後不應該處置它們?
你鏈接到的文章只是救了我:)謝謝! – defines