コード例 #1
0
        public void RemoveWorkHandlerLostEventExample()
        {
            int eventSize      = 8;
            var countdownEvent = new CountdownEvent(eventSize);

            var workSequence = new Sequence();

            var disruptor  = new Disruptor <StubEvent>(StubEvent.EventFactory, 4);
            var ringBuffer = disruptor.Start();

            var handler1   = new DynamicHandler(1, countdownEvent);
            var processor1 = new WorkProcessor <StubEvent>(ringBuffer, ringBuffer.NewBarrier(), handler1, new FatalExceptionHandler(), workSequence);

            var handler2   = new DynamicHandler(2, countdownEvent);
            var processor2 = new WorkProcessor <StubEvent>(ringBuffer, ringBuffer.NewBarrier(), handler2, new FatalExceptionHandler(), workSequence);

            ringBuffer.AddGatingSequences(processor1.Sequence);
            Task.Run(() => processor1.Run());

            ringBuffer.AddGatingSequences(processor2.Sequence);
            Task.Run(() => processor2.Run());

            handler1.AwaitStart();
            handler2.AwaitStart();

            Thread.Sleep(10);

            // processor1 should own an unavailable work sequence
            // => this sequence will be dropped by Halt
            processor1.Halt();

            var producer = new MessageProducer(disruptor, InitData(0, eventSize));

            Task.Run(() => producer.Run());
            producer.AwaitStart();

            handler1.AwaitShutdown();

            ringBuffer.RemoveGatingSequence(processor1.Sequence);

            // countdownEvent should not reach zero because of the dropped sequence
            var await = countdownEvent.Wait(TimeSpan.FromMilliseconds(500));

            Assert.IsFalse(await);
        }
コード例 #2
0
        public void RemoveWorkHandlerLaterTest()
        {
            var eventSize      = 8;
            var countdownEvent = new CountdownEvent(eventSize);

            var workSequence = new Sequence();

            var disruptor  = new Disruptor <StubEvent>(StubEvent.EventFactory, 4);
            var ringBuffer = disruptor.Start();

            var handler1   = new DynamicHandler(1, countdownEvent);
            var processor1 = new WorkProcessor <StubEvent>(ringBuffer, ringBuffer.NewBarrier(), handler1, new FatalExceptionHandler(), workSequence);

            var handler2   = new DynamicHandler(2, countdownEvent);
            var processor2 = new WorkProcessor <StubEvent>(ringBuffer, ringBuffer.NewBarrier(), handler2, new FatalExceptionHandler(), workSequence);

            ringBuffer.AddGatingSequences(processor1.Sequence);
            Task.Run(() => processor1.Run());

            ringBuffer.AddGatingSequences(processor2.Sequence);
            Task.Run(() => processor2.Run());

            handler1.AwaitStart();
            handler2.AwaitStart();

            Thread.Sleep(10);

            // processor1 should own an unavailable work sequence
            // => this sequence should not be dropped by HaltLater
            processor1.HaltLater();

            var producer = new MessageProducer(disruptor, InitData(0, eventSize));

            Task.Run(() => producer.Run());
            producer.AwaitStart();

            handler1.AwaitShutdown();

            ringBuffer.RemoveGatingSequence(processor1.Sequence);

            Assert.IsTrue(countdownEvent.Wait(TimeSpan.FromSeconds(3)));
        }