繁体   English   中英

避免事件发生内存泄漏

[英]Avoiding memory leaks with events

class Subscriber
{
    private Publisher _publisher;

    void SomeMethod()
    {
        _publisher = new Publisher();
        _publisher.SomeEvent += HandleEvent;
    }

    void HandleEvent(object sender, EventArgs e)
    {

    }
}

class Publisher
{
    public event EventHandler SomeEvent;

    void FireEvent()
    {
        SomeEvent?.Invoke(this, EventArgs.Empty);
    }
}

我是否需要分离HandleEventSomeEvent以避免内存泄漏? 订阅者的寿命比Publisher长,所以我的理解是,当Publisher被SomeEvent时,它也将清除SomeEvent所有事件处理程序,因此不应该有任何引用。 我对吗?

订阅者的寿命比发布者长

这意味着你没事,不需要通过取消订阅来复杂化。

语句_publisher.SomeEvent += HandleEvent; 从_publisher创建一个(有点隐藏)引用到它的所有者。 这样可以防止收集订阅者,但只有当发布者超过它时才会收集订阅者。

由于_publisher是私有的,因此清理是隐式的。 你不必(不应该)在这里添加IDisposable。 也就是说,不是为了管理事件。

因为你标记了这个WinForms:所有那些事件处理程序(例如Button1_Click)都创建从Control到拥有表单的引用,也不需要在那里进行清理。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM