public override void Process(int currentTime)
        {
            if (ReadyTasks.Count == 0)
            {
                return;
            }

            var processingTime = 1 / (float)ReadyTasks.Count;

            while (ReadyTasks.Any())
            {
                TrySetCurrentTaskFromReadyTasks();
                ProcessCurrentTask(currentTime, processingTime);
            }

            //ReadyTasks queue is empty, we add tasks that are not finished in current iteration, for next iterations
            ReadyTasks.AddRange(_tasksNoFinishedInCurrentIteration);
            _tasksNoFinishedInCurrentIteration.Clear();
        }
        private bool CheckIfCurrentTaskIsBest(int currentTime)
        {
            if (_currentTaskIsSecondTier && ReadyTasks.Any())
            {
                //we have better task in ReadyTasks
                TrySetCurrentTaskFromReadyTasks(); //replaces CurrentTask with task from ReadyTasks, "old" CurrentTask from _secondTierList in still first on list
                _currentTaskIsSecondTier = false;
            }

            CurrentTask.WaitingTime = GetTaskWaitingTime(currentTime, CurrentTask);

            if (CurrentTask.IsDelayed && ReadyTasks.Any())
            {
                _secondTierTasks.Add(CurrentTask); //already delayed, we take next task
                TrySetCurrentTaskFromReadyTasks();
                return(false);                     //we have to check task, that just have been assigned as CurrentTask
            }

            return(true);
            //task is not delayed, or delayed, but we don't have any more tasks
            //TODO: priority: we shoud check if secondTierTasks contains better task
        }
示例#3
0
        public void AddNewTasks(IEnumerable <TaskModel> tasks)
        {
            var schedulerTasks = tasks.Select(GetSchedulerTask).ToList();

            ReadyTasks.AddRange(schedulerTasks);
        }