【问题标题】:Autofac Garbage Collection - BeginLifetimeScopeAutofac 垃圾收集 - BeginLifetimeScope
【发布时间】:2012-09-03 14:19:26
【问题描述】:

我创建了一个 Windows 服务来构建和发送电子邮件。我已经实现了依赖注入,并且我使用 Autofac 作为 DI 容器。

我的问题是,随着服务运行,分配的内存不断增长,目前已超过 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?

我的很多对象都进入了第 2 代并被保留。生命周期结束后不应该丢弃它们吗?

【问题讨论】:

  • 你链接到的文章救了我:) 谢谢!!!

标签: autofac


【解决方案1】:

Autofac 设置看起来不错。您确定 DbContainer 正在释放所有资源吗?

【讨论】:

  • DbContainer 是实体框架。 Autofac 不会在生命周期结束时自动处理它吗?
  • DbContainer 是您开发的吗?我不认为它是 EF 的一部分...
  • 它是实体框架上下文,每个数据库表都有 IDbSets
  • 您如何确定它没有被处置?
  • 我没有。我正在尝试掌握.Net Memory Profiler。我以为我没有正确设置 Autofac,我之前只使用过 WCF 和 MVC Autofac 实现。
猜你喜欢
  • 2011-01-21
  • 1970-01-01
  • 2018-12-30
  • 1970-01-01
  • 1970-01-01
  • 2010-12-13
  • 2012-05-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多