Пример #1
0
 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);
 }
Пример #2
0
        public virtual async Task Start()
        {
            _status = TaskQueuePoolStatus.Running;
            Logger.LogInformation($"Pool [{GetType().Name}] started");
            await Task.Run(_execute);

            Logger.LogInformation($"Pool [{GetType().Name}] stopped");
        }
Пример #3
0
 /// <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;
 }