/// <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; }
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(); }