我创建了一个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();
Run Code Online (Sandbox Code Playgroud)
下面是每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();
}
Run Code Online (Sandbox Code Playgroud)
我希望每个电子邮件计时器迭代都使用相同的EmailManager实例,但要使用其他所有实例的新实例。
编辑
有没有一种方法可以检查EmailBuilder及其所有依赖项是否已被处置并且可以用于GC?
我的许多对象都将进入第二代并被保留。使用寿命结束后是否应该将其丢弃?
| 归档时间: |
|
| 查看次数: |
848 次 |
| 最近记录: |