Exemple #1
0
        private async Task RunTask(int currentTask, TParam param, SchedulerGraph <T> graph, SemaphoreSlim graphLock, CancellationToken cancellationToken)
        {
            cancellationToken.ThrowIfCancellationRequested();

            await _awaitableSelector(Tasks[currentTask], param, cancellationToken);

            int[] nextTasks;
            await graphLock.WaitAsync(cancellationToken);

            try
            {
                nextTasks = graph.GetNextTasks(currentTask).ToArray();
            }
            finally
            {
                graphLock.Release();
            }

            await Task.WhenAll(nextTasks.Select(x => RunTask(x, param, graph, graphLock, cancellationToken)));
        }
Exemple #2
0
        private void UpdateSchedule()
        {
            _schedule.Clear();
            _schedule.Capacity = Tasks.Count;

            var graph = new SchedulerGraph <T>(Tasks, Rules);

            var pendingTasks = new Queue <int>(graph.GetPendingTasks());

            while (pendingTasks.Count > 0)
            {
                int currentTask = pendingTasks.Dequeue();

                _schedule.Add(Tasks[currentTask]);

                foreach (int nextTask in graph.GetNextTasks(currentTask))
                {
                    pendingTasks.Enqueue(nextTask);
                }
            }

            IsDirty = false;
        }