具有弱引用的发布者-订阅者(观察者模式)

时间:2019-03-15 21:16:11

标签: c# observer-pattern weak-references weakeventmanager

我遇到的情况是,使用WinForms(订阅者)向用户提供的数据(发布者)很长。修改数据后,我们希望UI也进行更新。最初的想法是使用事件并使UI在发布者上订阅事件。但是,这会导致内存泄漏,因为数据会超出可能出现并呈现的UI各个部分的寿命。

进行一点挖掘,发现MSDN上的WeakEventManager和相关模式。尽管这看起来像一个解决方案,但它引入了一个不完全基本的模式更改,即在发布者和订阅者之间使用中间人(WeakEventManager定制实现)。我们的商店一直都有开发人员在产品和语言之间切换,我担心在未来十年中,一些维护代码的可怜的开发人员将不得不花太多时间试图理解WeakEventManager和这种模式。

由于WeakEventManager已经打破了标准的事件订阅机制,并且继承的实现超过了几行,所以我想知道它是否比以下更清晰的东西有什么真正的好处,可以直接将其添加到发布者(无中间人)。有想法吗?

订户将实现一个接口,例如:

public interface IDataChangedListener
{
    void OnDataChanged(Object model);
}

发布者会有这样的东西:

    private static List<WeakReference> listeners = new List<WeakReference>();

    public static void AddListener(IDataChangedListener listener)
    {
        lock (listener)
        {
            listeners.Add(new WeakReference(listener));
        }
    }

    public static void RemoveListener(IDataChangedListener listener)
    {
        lock (listener)
        {
            listeners.RemoveAll(x => x.Target == listener);
        }
    }

    private static void NotifyListeners(object model)
    {
        lock (listeners)
        {
            listeners.RemoveAll(x => !x.IsAlive); //Purge
            foreach (IDataChangedListener listener in listeners)
            {
                if (listener != null)
                {
                    listener.OnDataChanged(model);
                }
            }
        }
    }

有想法吗?

0 个答案:

没有答案