在.NetCore中使用弱事件

时间:2016-12-13 21:39:44

标签: c# asp.net-core

看起来弱势事件或更具体的WeakEventManagerIWeakEventListener在.Net Core中不可用,因为它们是 WindowsBase 程序集的一部分。

是否有此功能的替代品?

事件通常是应用程序中内存泄漏的来源,弱引用是处理此问题的好方法。

我在stackoverflow

中找不到关于此主题的任何信息

2 个答案:

答案 0 :(得分:7)

Nito.Mvvm.Core有一个WeakCanExecuteChagned类,它使用命令类来执行弱事件,您可以将其用作编写由WeakCollection<EventHandler>支持的经理的起点。

以下是一个使用自定义类的简单示例,其中包含名为Foo的事件,该事件包含FooEventArgs个对象。

public class MyClass
{
    private readonly WeakCollection<EventHandler<FooEventArgs>> _foo = new WeakCollection<EventHandler<FooEventArgs>>();

    public event EventHandler<FooEventArgs> Foo
    {
        add
        {
            lock (_foo)
            {
                _foo.Add(value);
            }
        }
        remove
        {
            lock (_foo)
            {
                _foo.Remove(value);
            }
        }
    }

    protected virtual void OnFoo(FooEventArgs args)
    {
        lock (_foo)
        {
            foreach (var foo in _foo.GetLiveItems())
            {
                foo(this, args);
            }
        }
    }
}

答案 1 :(得分:0)

我的库 System.Waf.Core 提供了一个 WeakEvent 实现,可用作 WeakEventManager 的替代方案。

INotifyPropertyChanged.PropertyChanged 的​​

示例

public class Publisher : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler? PropertyChanged;
}

public class Subscriber
{
    public void Init(Publisher publisher)
    {
        // Instead of publisher.PropertyChanged += Handler; use the following statement:
        WeakEvent.PropertyChanged.Add(publisher, Handler)        
    }

    public void Handler(object? sender, PropertyChangedEventArgs e) { }
}

可以在此 Wiki 页面 Weak Event 上找到更多详细信息。