【发布时间】:2020-05-01 23:26:44
【问题描述】:
我有一个只能使用 WeakEventManager 订阅的事件(对于无法取消注册的 ViewModel,因为它们没有可靠的卸载/处置机制),我想隐藏原始事件以防止其他人使用 @ 987654323@.
一个问题是WeakEventManager 订阅的事件必须是公开的,即不隐藏。这篇文章 (Using WeakEventManager, hiding the actual event) 有一个有趣的解决方案,其中事件被包装在一个私有类中(带有一个公共事件)。
我采用了该解决方案并提出了以下帮助程序类:
public class WeakEvent<TEventArgs> where TEventArgs : EventArgs
{
private class InternalWrapper
{
public event EventHandler<TEventArgs> InternalEvent;
public void Invoke(object sender, TEventArgs args) => InternalEvent?.Invoke(sender, args);
}
private InternalWrapper _wrapper = new InternalWrapper();
public void Subscribe(EventHandler<TEventArgs> handler)
{
WeakEventManager<InternalWrapper, TEventArgs>.AddHandler(_wrapper, nameof(InternalWrapper.InternalEvent), handler);
}
public void Invoke(object sender, TEventArgs args) => _wrapper.Invoke(sender, args);
}
我的问题是:事件可以被触发,但在InternalWrapper.Invoke 内,InternalEvent 总是有一个null 调用列表 - 好像WeakEventManager 创建的注册被垃圾收集了,虽然handler 是一个一个非常活跃的实例的方法。
可能是泛型吗?
【问题讨论】:
标签: c# events memory-leaks garbage-collection