簡體   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