private Task _execute() { while (_status == TaskQueuePoolStatus.Running && (_queuedTaskDataCount > 0 || _currentThreadCount > 0)) { if (_options.MaxThreads == 0 || _currentThreadCount < _options.MaxThreads) { if (_queuedTaskData.TryDequeue(out var taskData)) { Interlocked.Decrement(ref _queuedTaskDataCount); var task = this.FirstOrDefault(t => t.CanExecuteData() && t.MatchedTaskData(taskData)); if (task != null) { Interlocked.Increment(ref _currentThreadCount); Interlocked.Increment(ref task.CurrentThreadCount); _executeTask(task, taskData); } else { Enqueue(taskData); } } } } _status = TaskQueuePoolStatus.Idle; _queuedTaskDataCount = 0; return(Task.CompletedTask); }
public virtual async Task Start() { _status = TaskQueuePoolStatus.Running; Logger.LogInformation($"Pool [{GetType().Name}] started"); await Task.Run(_execute); Logger.LogInformation($"Pool [{GetType().Name}] stopped"); }
/// <summary> /// All task data will be cleared. The running tasks will not be stopped, but the task data produced by them will not be enqueued to the queue. /// </summary> public virtual void Stop() { _status = TaskQueuePoolStatus.Idle; _queuedTaskData = new ConcurrentQueue <TaskData>(); _queuedTaskDataCount = 0; }