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))); }
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; }