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