[英]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.