/// <summary> /// Initialises a new instance of the <see cref="DefaultParallelRunner"/> class. /// </summary> /// <param name="degreeOfParallelism">The number of concurrent <see cref="Task"/> used to update an <see cref="IParallelRunnable"/> in parallel.</param> /// <exception cref="ArgumentException"><paramref name="degreeOfParallelism"/> cannot be inferior to one.</exception> public DefaultParallelRunner(int degreeOfParallelism) { IEnumerable <int> indices = degreeOfParallelism >= 1 ? Enumerable.Range(0, degreeOfParallelism - 1) : throw new ArgumentException("Argument cannot be inferior to one", nameof(degreeOfParallelism)); _disposeHandle = new CancellationTokenSource(); _tasks = indices.Select(index => new Task(Update, index, TaskCreationOptions.LongRunning)).ToArray(); _barrier = degreeOfParallelism > 1 ? new WorkerBarrier(_tasks.Length) : null; foreach (Task task in _tasks) { task.Start(TaskScheduler.Default); } }