【问题标题】:Does this event-handling code cause a memory leak?此事件处理代码是否会导致内存泄漏?
【发布时间】:2023-03-11 16:31:01
【问题描述】:

这是内存泄漏吗?

private void Process()
{
    for (; ; )
    {
        // local variable
        RemoteClient remoteClient = new RemoteClient(..);
        // subscription without unsubscription
        remoteClient.BadClient += new EventHandler(remoteClient_BadClient); 
    }

..
}

public class RemoteClient
{
  ...
  public event EventHandler BadClient;
}

【问题讨论】:

标签: c# memory-leaks .net-3.5 garbage-collection


【解决方案1】:

这取决于 RemoteClient 类中的其他内容。如果dispose 没有对象,则说明没有内存泄漏。如果有任何带有IDisposable 内容的对象,则需要继承 ÌDisposable` 并销毁这些对象。 我认为删除处理程序和退出循环对您来说也不是什么新鲜事。

因为客户端听起来像一个 web 服务,所以看看所谓的异步线程可能很重要。 .NET: Do I need to keep a reference to WebClient while downloading asynchronously?

此外,如果整个内容变得更加复杂,检查对象状态也很重要。

【讨论】:

    【解决方案2】:

    如果您退出 for 循环,这不是内存泄漏。每个remoteClient 都将持有对remoteClient_BadClient 委托的引用,但remoteClient 本身将适用于每次迭代后的垃圾收集(如果您没有在其他地方存储对remoteClient 的引用!)。收集remoteClient 还将处理对remoteClient_BadClient 委托的引用,这也将允许收集它。

    【讨论】:

      【解决方案3】:

      不,除非您处于无限循环中。

      【讨论】:

      • 他处于无限循环中,这很可能只是伪代码。忽略这一点。它不会自行泄漏。
      • 我觉得这里的关键是//订阅不退订,你可以问,没看懂就不用降级了。谢谢。
      猜你喜欢
      • 2017-12-05
      • 2020-01-29
      • 1970-01-01
      • 2013-04-04
      • 2012-01-18
      • 2012-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多