c# – 将WeakEventManager与静态事件一起使用
发布时间:2020-12-15 07:53:14 所属栏目:百科 来源:网络整理
导读:是否可以使用WeakEventManager在静态事件上创建弱事件侦听器? 我想在静态CompositionTarget.Rendering事件上创建一个弱事件监听器,以避免在我不知道WPF / Silverlight源元素的生命周期时发生内存泄漏. 我在weak event pattern之前实现了渲染事件管理器: pu
是否可以使用WeakEventManager在静态事件上创建弱事件侦听器?
我想在静态CompositionTarget.Rendering事件上创建一个弱事件监听器,以避免在我不知道WPF / Silverlight源元素的生命周期时发生内存泄漏. 我在weak event pattern之前实现了渲染事件管理器: public class RenderingEventManager : WeakEventManager { public static void AddListener(IWeakEventListener listener) { CurrentManager.ProtectedAddListener(null,listener); } public static void RemoveListener(IWeakEventListener listener) { CurrentManager.ProtectedRemoveListener(null,listener); } private static RenderingEventManager CurrentManager { get { var managerType = typeof(RenderingEventManager); var manager = (RenderingEventManager)GetCurrentManager(managerType); if (manager == null) { manager = new RenderingEventManager(); SetCurrentManager(managerType,manager); } return manager; } } protected sealed override void StartListening(object source) { CompositionTarget.Rendering += this.OnCompositionTargetRendering; } protected sealed override void StopListening(object source) { CompositionTarget.Rendering -= this.OnCompositionTargetRendering; } void OnCompositionTargetRendering(object sender,EventArgs e) { this.DeliverEvent(sender,e); } } 并在一个简单的窗口中测试了经理: public partial class Window1 : Window,IWeakEventListener { public Window1() { InitializeComponent(); RenderingEventManager.AddListener(this); } bool IWeakEventListener.ReceiveWeakEvent(Type managerType,object sender,EventArgs e) { return true; } } 未调用ReceiveWeakEvent方法.调用OnCompositionTargetRendering,但似乎DeliverEvent不能像我预期的那样工作. A post on Microsoft Connect from 2009声明不支持静态事件, protected void ProtectedAddListener(object source,IWeakEventListener listener) { Debug.Assert(listener != null,"Listener cannot be null"); object sourceKey = (source != null) ? source : StaticSource; ... } 解决方法
自己弄清楚:将DeliverEvent方法的sender参数更改为null:
void OnCompositionTargetRendering(object sender,EventArgs e) { this.DeliverEvent(null,e); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |