public void TestMultipleUnlistenWeak() { StreamSink <int> s = Stream.CreateSink <int>(); List <int> @out = new List <int>(); ((Action)(() => { // ReSharper disable once UnusedVariable IWeakListener l = s.ListenWeak(@out.Add); s.Send(1); l.Unlisten(); l.Unlisten(); s.Send(2); l.Unlisten(); }))(); s.Send(3); s.Send(4); Assert.AreEqual(1, @out.Count); }
internal IStrongListener ListenImpl(Action <T> handler) { IWeakListener innerListener = this.ListenWeakImpl(handler); StrongListener listener = null; listener = new StrongListener( () => { innerListener.Unlisten(); // ReSharper disable AccessToModifiedClosure if (listener != null) { lock (this.KeepListenersAlive) { this.KeepListenersAlive.StopKeepingListenerAlive(listener); } } // ReSharper restore AccessToModifiedClosure }, innerListener); lock (this.KeepListenersAlive) { this.KeepListenersAlive.KeepListenerAlive(listener); } return(listener); }