示例#1
0
 /// <summary>
 /// Create instance of the asynchronous queue (LMAX Disruptor version).
 /// </summary>
 /// <param name="name">Name of the asynchronous queue</param>
 /// <param name="claimStrategy">Type of the claim strategy</param>
 /// <param name="waitStrategy">Type of the wait strategy</param>
 /// <param name="bufferSize">Disruptor buffer size</param>
 public AsyncQueueDisruptor(string name, ClaimStrategyType claimStrategy = ClaimStrategyType.MultiThreaded, WaitStrategyType waitStrategy = WaitStrategyType.Yielding, int bufferSize = 1024)
 {
     Name          = name;
     ClaimStrategy = claimStrategy;
     WaitStrategy  = waitStrategy;
     BufferSize    = bufferSize;
 }
示例#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();
        }