예제 #1
0
        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);
        }
예제 #2
0
        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();
        }