public void Returns_Average()
        {
            var metric = new AverageMetric();

            metric.Report(1);
            metric.Report(3);
            Assert.AreEqual(2, metric.Average);
        }
        public async Task Returns_AverageAsync()
        {
            var metric = new AverageMetric();

            var readers = new List <Task>();
            var tasks   = new List <Task>();

            for (int i = 0; i < 10000; ++i)
            {
                tasks.Add(Task.Run(() => metric.Report(2)));

                if (i % 10 == 0)
                {
                    readers.Add(Task.Run(() => Assert.AreEqual(2, metric.Average)));
                }
            }

            await Task.WhenAll(tasks);

            Assert.AreEqual(2, metric.Average);
            await Task.WhenAll(readers);
        }
Example #3
0
        public void Eventually_returns_value_when_multiple_threads()
        {
            const int threadCount = 8;
            const int spinCount   = 1000_000;

            var threads = new Thread[threadCount];
            var wait    = new ManualResetEvent(false);

            var metric = new AverageMetric();

            for (var i = 0; i < threadCount; i++)
            {
                var threadNo = i;
                threads[i] = new Thread(() =>
                {
                    wait.WaitOne();

                    for (var j = 0; j < spinCount; j++)
                    {
                        metric.Report(threadNo % 2); // report 0 or 1
                    }
                });
            }

            foreach (var thread in threads)
            {
                thread.Start();
            }

            wait.Set();

            foreach (var thread in threads)
            {
                thread.Join();
            }

            Assert.AreEqual(0.5d, metric.Average);
        }
Example #4
0
        public async Task Returns_Average_MultiThreaded()
        {
            const int iterations = 100000;
            var       metric     = new AverageMetric();
            var       t1         = Task.Run(async() =>
            {
                await Task.Delay(1000);
                for (int i = 0; i < iterations; i++)
                {
                    metric.Report(1);
                }
            });
            var t2 = Task.Run(async() =>
            {
                await Task.Delay(1000);
                for (int i = 0; i < iterations; i++)
                {
                    metric.Report(3);
                }
            });
            await Task.WhenAll(t1, t2);

            Assert.AreEqual(2, metric.Average);
        }