[英]Why is the implementation of events in C# not using a weak event pattern by default?
[英]Using Weak Event in .NetCore
看起來弱事件或更具體地說是WeakEventManager
或IWeakEventListener
在 .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.