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