繁体   English   中英

在 .NetCore 中使用弱事件

[英]Using Weak Event in .NetCore

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

是否有此功能的替代方案?

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

我在 stackoverflow 中找不到有关此主题的任何信息

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);
            }
        }
    }
}

我的库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 页面弱事件中找到更多详细信息。

暂无
暂无

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

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