Example #1
0
        public void StopProcessing()
        {
            // Check the processing started flag.
            if (!IsProcessing)
            {
                return;
            }

            // Stop adding to the processing disruptor.
            _processingDisruptor.Shutdown();

            _processingConsumer   = null;
            _processingDisruptor  = null;
            _processingRingBuffer = null;

            // Reset asynchronous queue size.
            Interlocked.Exchange(ref _asyncQueueSize, 0);

            // Reset the processing started flag.
            IsProcessing = false;

            // Rise asynchronous processing stop event.
            HandleStop();
        }
Example #2
0
        public void StartProcessing()
        {
            // Check the processing started flag.
            if (IsProcessing)
            {
                throw new InvalidOperationException(Resources.Strings.AsyncQueueStartError);
            }

            _claimStrategy = ClaimStrategy;
            _waitStrategy  = WaitStrategy;
            _bufferSize    = Math.Max(128, BufferSize);

            // Reset asynchronous queue size.
            Interlocked.Exchange(ref _asyncQueueSize, 0);

            IClaimStrategy disruptorClaimStrategy;

            switch (_claimStrategy)
            {
            case ClaimStrategyType.SingleThreaded:
                disruptorClaimStrategy = new SingleThreadedClaimStrategy(_bufferSize);
                break;

            case ClaimStrategyType.MultiThreaded:
                disruptorClaimStrategy = new MultiThreadedClaimStrategy(_bufferSize);
                break;

            case ClaimStrategyType.MultiThreadedLowContention:
                disruptorClaimStrategy = new MultiThreadedLowContentionClaimStrategy(_bufferSize);
                break;

            default:
                disruptorClaimStrategy = new MultiThreadedClaimStrategy(_bufferSize);
                break;
            }

            IWaitStrategy disruptorWaitStrategy;

            switch (_waitStrategy)
            {
            case WaitStrategyType.Blocking:
                disruptorWaitStrategy = new BlockingWaitStrategy();
                break;

            case WaitStrategyType.BusySpin:
                disruptorWaitStrategy = new BusySpinWaitStrategy();
                break;

            case WaitStrategyType.Sleeping:
                disruptorWaitStrategy = new SleepingWaitStrategy();
                break;

            case WaitStrategyType.Yielding:
                disruptorWaitStrategy = new YieldingWaitStrategy();
                break;

            default:
                disruptorWaitStrategy = new YieldingWaitStrategy();
                break;
            }

            // Initialize processing consumer.
            _processingConsumer = new ProcessingConsumer(this);

            // Initialize processing disruptor.
            _processingDisruptor = new Disruptor <ValueEntry>(() => new ValueEntry(), disruptorClaimStrategy, disruptorWaitStrategy, TaskScheduler.Default);
            _processingDisruptor.HandleEventsWith(_processingConsumer);

            // Create ring buffer.
            _processingRingBuffer = _processingDisruptor.Start();

            // Set the processing started flag.
            IsProcessing = true;

            // Rise asynchronous processing start event.
            HandleStart();
        }