public void Run(Stopwatch sw) { var mre = new ManualResetEvent(false); _fizzBuzzHandler.Reset(mre, _batchProcessorFizzBuzz.Sequence.Value + _iterations); var processorTask1 = Task.Run(() => _batchProcessorFizz.Run()); var processorTask2 = Task.Run(() => _batchProcessorBuzz.Run()); var processorTask3 = Task.Run(() => _batchProcessorFizzBuzz.Run()); _batchProcessorFizz.WaitUntilStarted(TimeSpan.FromSeconds(5)); _batchProcessorBuzz.WaitUntilStarted(TimeSpan.FromSeconds(5)); _batchProcessorFizzBuzz.WaitUntilStarted(TimeSpan.FromSeconds(5)); sw.Start(); for (long i = 0; i < _iterations; i++) { var sequence = _ringBuffer.Next(); _ringBuffer[sequence].Value = i; _ringBuffer.Publish(sequence); } mre.WaitOne(); sw.Stop(); _batchProcessorFizz.Halt(); _batchProcessorBuzz.Halt(); _batchProcessorFizzBuzz.Halt(); Task.WaitAll(processorTask1, processorTask2, processorTask3); }
private const int _ringSize = 16; // Must be multiple of 2 static void Main(string[] args) { var sw = new Stopwatch(); sw.Start(); var ringBuffer = RingBuffer <MyValueEntry> .CreateSingleProducer(() => new MyValueEntry(), _ringSize, new YieldingWaitStrategy()); //Case A: 1 Producer - 1 Consumer (Unicast event) var sequenceBarrier = ringBuffer.NewBarrier(); var batchProcessorPrintVal = new BatchEventProcessor <MyValueEntry>(ringBuffer, sequenceBarrier, new MyValueAdditionHandler()); var processorTask1 = Task.Run(() => batchProcessorPrintVal.Run()); batchProcessorPrintVal.WaitUntilStarted(TimeSpan.FromSeconds(5)); Simulator.SimulatePublishEvent(ringBuffer, 1000); batchProcessorPrintVal.Halt(); Task.WaitAll(processorTask1); sw.Stop(); Console.WriteLine($"elapsed {sw.ElapsedMilliseconds} ms"); Console.Read(); }