I am trying to implement WeakEventManager in PCL using Reactive library.
Thus, the fact is that it maintains a weak link for the subscriber and every time an event is triggered, it receives a delegate from the subscriber and starts it, but if it cannot receive the object due to the weak link, it has a link to the delegate.
The problem is that after a short period of time, the weak link returns zero (but the subscriber is still alive), and after that the link is deleted. So my question is, why is this happening and how to fix it?
Here's what it looks like: (Look at the note in the code)
private static IDisposable InternalSubscribeWeakly<TEventPattern, TEvent>(this IObservable<TEventPattern> observable, TEvent Weak_onNext, Action<TEvent, TEventPattern> onNext) where TEvent : class { if (onNext.Target != null) throw new ArgumentException("onNext must refer to a static method, or else the subscription will still hold a strong reference to target");
And here is how I subscribe using this manager:
private void NoLeakWindow_Loaded(object sender, RoutedEventArgs e) { Loaded -= NoLeakWindow_Loaded; this.ObserveOn<Window, ElapsedEventHandler, ElapsedEventArgs>(h => (o, s) => h(o, s), r => MainWindow.EPublisher.EventTimer.Elapsed += r, r => MainWindow.EPublisher.EventTimer.Elapsed -= r) .SubscribeWeakly(EventTimer_Elapsed); this.ObserveOn<Window, ElapsedEventHandler, ElapsedEventArgs>( h => (o, s) => h(o, s), r => MainWindow.EPublisher.EventTimer.Elapsed += r, r => MainWindow.EPublisher.EventTimer.Elapsed -= r) .SubscribeWeakly(EventTimer_Elapsed2); } private void EventTimer_Elapsed(EventPattern<ElapsedEventArgs> e) { MessageBox.Show("EventTimer_Elapsed By Timer"); } private void EventTimer_Elapsed2(EventPattern<ElapsedEventArgs> e) { MessageBox.Show("EventTimer2_Elapsed2 By Timer2"); }
And my event publisher:
public class EventPublisher { public Timer EventTimer = new Timer(3000); public Timer EventTimer2 = new Timer(2700); public event EventHandler<EventArgs> TimeElapsed; public EventPublisher() { EventTimer.Start(); EventTimer2.Start(); } }
And finally, the full code for the WeakEventManager class:
c # memory-leaks system.reactive weak-references weak-events
sponger94
source share