public void Returns_Average() { var metric = new AverageMetric(); metric.Report(1); metric.Report(3); Assert.AreEqual(2, metric.Average); }
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); }
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); }
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); }