public DefaultParallelQueueConsumer( ParallelQueueConsumerOptions <TEntity, TState> options, IServiceProvider serviceProvider, string namePrefix, TState state, ILoggerFactory loggerFactory) { if (options == null) { throw new ArgumentNullException(nameof(options)); } _options = options; _loggerFactory = loggerFactory; _serviceProvider = serviceProvider; _namePrefix = namePrefix; _state = state; int executorCount = _options.ExecutorCount; if (_options.ExecutorCount < 1) { executorCount = 1; } var _logger = _loggerFactory.CreateLogger <ParallelQueueExecutor <TEntity, TState> >(); List <BlockingCollection <TEntity> > queueList = new List <BlockingCollection <TEntity> >(); for (int i = 0; i < executorCount; i++) { string name = $"{namePrefix}{i}"; var executor = new ParallelQueueExecutor <TEntity, TState>( _serviceProvider, _options, _logger, name, state); _executorList.Add(executor); queueList.Add(executor.Queue); } _queueList = queueList.ToArray(); }
public ParallelQueueExecutor( IServiceProvider serviceProvider, ParallelQueueConsumerOptions <TEntity, TState> options, ILogger <ParallelQueueExecutor <TEntity, TState> > logger, string name, TState state) { if (options == null) { throw new ArgumentNullException(nameof(options)); } if (logger == null) { throw new ArgumentNullException(nameof(logger)); } if (options.ExecuteDelegate == null) { throw new ArgumentNullException(nameof(options.ExecuteDelegate)); } if (serviceProvider == null) { throw new ArgumentNullException(nameof(serviceProvider)); } _serviceProvider = serviceProvider; int capacity = options.ExecutorQueueCapacity; if (capacity <= 0) { capacity = 1; } IProducerConsumerCollection <TEntity> innerQueue = null; switch (options.ExecutorQueueType) { case QueueType.FIFO: innerQueue = new ConcurrentQueue <TEntity>(); break; case QueueType.LIFO: innerQueue = new ConcurrentStack <TEntity>(); break; case QueueType.Bag: innerQueue = new ConcurrentBag <TEntity>(); break; default: innerQueue = new ConcurrentQueue <TEntity>(); break; } Queue = new BlockingCollection <TEntity>(innerQueue, capacity); Options = options; Name = name; Counter = 0; State = state; _logger = logger; var period = options.StatisticalPeriod; if (period.TotalSeconds < 10) { period = TimeSpan.FromSeconds(10); } // 最长时间1小时 if (period.TotalHours > 1) { period = TimeSpan.FromHours(1); } StatisticalPeriod = period; }