public void GCTest()
        {
            var provider = new MyEventProvider();
            var listener = new MyEventListener();

            listener.Listen(provider);
            Assert.That(EventManager.Count, Is.EqualTo(1), "WeakEventManager.Count");

            provider.Raise();
            Assert.That(listener.Count, Is.EqualTo(1), "listener.Count");

//			var weakListener = new WeakReference(listener);
            listener = null;
            // how long we have to wait until the GC collects?

            GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect();

            var stopwatch = new Stopwatch(); stopwatch.Start();

            while (EventManager.Count > 0)
            {
                provider.Raise();
                Thread.Sleep(10);
            }
            Trace.WriteLine("Collected after " + stopwatch.Elapsed);
            //Assert.That(WeakEventManager.Count, Is.EqualTo(0),"WeakEventManager.Count");
        }
        public void EventHandler()
        {
            var provider = new MyEventProvider();
            var listener = new MyEventListener();

            listener.Listen(provider);
            provider.Raise();
            Assert.That(listener.Count, Is.EqualTo(listener.Count), "listener.Count");
        }
        public void GCCollectTest()
        {
            var provider = new MyEventProvider();
            var listener = new MyEventListener();

            listener.Listen(provider);
            Assert.That(EventManager.Count, Is.EqualTo(1), "WeakEventManager.Count");

            provider.Raise();
            Assert.That(listener.Count, Is.EqualTo(1), "listener.Count");

            listener = null;
            EventManager.Collect(true);
            Assert.That(EventManager.Count, Is.EqualTo(0), "WeakEventManager.Count");
        }
        public void PerformanceTest1()
        {
            var provider = new MyEventProvider();
            var listener = new MyEventListener();

            listener.Listen(provider);
            var count = 1000000;

            var stopwatch = new Stopwatch(); stopwatch.Start();

            for (int i = 0; i < count; i++)
            {
                provider.Raise();
            }
            stopwatch.Stop();
            Assert.That(listener.Count, Is.EqualTo(count), "listener.Count");
            Trace.WriteLine(string.Format("Time: {0}", new TimeSpan(stopwatch.ElapsedTicks * 1)));
        }
        public void MassiveGCTest()
        {
            var       provider  = new MyEventProvider();
            var       r         = new System.Random();
            var       stopwatch = new Stopwatch(); stopwatch.Start();
            const int max       = 2000;
            var       c         = EventManager.Count;

            for (int i = 1; i <= max; i++)
            {
                var listener = new MyEventListener();
                listener.Listen(provider);
                provider.Raise();
                Thread.Sleep(r.Next(8, 12 + 1));
                if (EventManager.Count + c < i)
                {
                    //OK any listener has been collected
                    Trace.WriteLine("GC collected at interation " + i + " " + stopwatch.Elapsed + " " + EventManager.Count + " alive");
                    c = i - EventManager.Count;
                }
            }
            Trace.WriteLine(EventManager.Count * 100 / max + "% alive after " + stopwatch.Elapsed);
            var next = stopwatch.Elapsed.Add(TimeSpan.FromSeconds(1));

            while (EventManager.Count > 0)
            {
                if (stopwatch.Elapsed < next)
                {
                    Thread.Sleep(10); EventManager.Collect(); continue;
                }
                Trace.WriteLine(EventManager.Count * 100 / max + "% alive after " + stopwatch.Elapsed);
                next = stopwatch.Elapsed.Add(TimeSpan.FromSeconds(1));
            }

            //Assert.Fail("Nothing collected!");
        }