private async Task RunTasksInQueue(int maxDegreeOfParallelism = 8) { var tasksInFlight = new List <Task>(maxDegreeOfParallelism); while (_pendingTaskFactories.Any()) { while (tasksInFlight.Count < maxDegreeOfParallelism && _pendingTaskFactories.Any()) { Func <Task> taskFactory = _pendingTaskFactories.Dequeue(); tasksInFlight.Add(taskFactory()); } Task completedTask = await Task.WhenAny(tasksInFlight).ConfigureAwait(false); await completedTask.ConfigureAwait(false); tasksInFlight.Remove(completedTask); } }
public async Task RunTasksInQueue(int maxDegreeOfParallelism = 8) { var tasksInFlight = new List <Task>(maxDegreeOfParallelism); while (_pendingTaskFactories.Any() || tasksInFlight.Any()) { while (tasksInFlight.Count < maxDegreeOfParallelism && _pendingTaskFactories.Any()) { Func <Task> taskFactory = _pendingTaskFactories.Dequeue(); tasksInFlight.Add(taskFactory()); this._logger.LogDebug($"Engine selected one job to run. Currently there are still {_pendingTaskFactories.Count()} jobs remaining. {tasksInFlight.Count} jobs running."); } Task completedTask = await Task.WhenAny(tasksInFlight).ConfigureAwait(false); await completedTask.ConfigureAwait(false); this._logger.LogInformation($"Engine finished one job. Currently there are still {_pendingTaskFactories.Count()} jobs remaining. {tasksInFlight.Count} jobs running."); tasksInFlight.Remove(completedTask); } }