![](/img/trans.png)
[英]Avoiding WeakEventManager and memory leaks on short lived viewmodels
[英]Avoiding memory leaks with events
class Subscriber
{
private Publisher _publisher;
void SomeMethod()
{
_publisher = new Publisher();
_publisher.SomeEvent += HandleEvent;
}
void HandleEvent(object sender, EventArgs e)
{
}
}
class Publisher
{
public event EventHandler SomeEvent;
void FireEvent()
{
SomeEvent?.Invoke(this, EventArgs.Empty);
}
}
我是否需要分离HandleEvent
从SomeEvent
以避免内存泄漏? 订阅者的寿命比Publisher长,所以我的理解是,当Publisher被SomeEvent
时,它也将清除SomeEvent
所有事件处理程序,因此不应该有任何引用。 我对吗?
订阅者的寿命比发布者长
这意味着你没事,不需要通过取消订阅来复杂化。
语句_publisher.SomeEvent += HandleEvent;
从_publisher创建一个(有点隐藏)引用到它的所有者。 这样可以防止收集订阅者,但只有当发布者超过它时才会收集订阅者。
由于_publisher是私有的,因此清理是隐式的。 你不必(不应该)在这里添加IDisposable。 也就是说,不是为了管理事件。
因为你标记了这个WinForms:所有那些事件处理程序(例如Button1_Click)都创建从Control到拥有表单的引用,也不需要在那里进行清理。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.