Example #1
0
        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);
        }
Example #2
0
        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);
        }