/// <summary> /// Construct a work pool with an internal <see cref="RingBuffer{T}"/> for convenience. /// /// This option does not require <see cref="Sequencer.SetGatingSequences"/> to be called before the work pool is started. /// </summary> /// <param name="eventFactory">eventFactory for filling the <see cref="RingBuffer{T}"/></param> /// <param name="exceptionHandler">exceptionHandler to callback when an error occurs which is not handled by the <see cref="IWorkHandler{T}"/>s.</param> /// <param name="workHandlers">workHandlers to distribute the work load across.</param> public WorkerPool(Func <T> eventFactory, IExceptionHandler <T> exceptionHandler, params IWorkHandler <T>[] workHandlers) { _ringBuffer = RingBuffer <T> .CreateMultiProducer(eventFactory, 1024, new BlockingWaitStrategy()); var barrier = _ringBuffer.NewBarrier(); _workProcessors = new WorkProcessor <T> [workHandlers.Length]; for (var i = 0; i < workHandlers.Length; i++) { _workProcessors[i] = new WorkProcessor <T>(_ringBuffer, barrier, workHandlers[i], exceptionHandler, _workSequence); } _ringBuffer.AddGatingSequences(GetWorkerSequences()); }
/// <summary> /// Construct a work pool with an internal {@link RingBuffer} for convenience. /// This option does not require {@link RingBuffer#AddGatingSequences(Sequence...)} to be called before the work pool is started. /// </summary> /// <param name="eventFactory">for filling the {@link RingBuffer}</param> /// <param name="exceptionHandler">to callback when an error occurs which is not handled by the {@link WorkHandler}s.</param> /// <param name="workHandlers">to distribute the work load across.</param> public WorkerPool(Func <T> eventFactory, IExceptionHandler exceptionHandler, params IWorkHandler <T>[] workHandlers) { ringBuffer = RingBuffer <T> .CreateMultiProducer(eventFactory, 1024, new BlockingWaitStrategy()); ISequenceBarrier barrier = ringBuffer.NewBarrier(); var numWorkers = workHandlers.Length; workProcessors = new WorkProcessor <T> [numWorkers]; for (var i = 0; i < numWorkers; i++) { workProcessors[i] = new WorkProcessor <T>(ringBuffer, barrier, workHandlers[i], exceptionHandler, workSequence); } ringBuffer.AddGatingSequences(getWorkerSequences()); }