예제 #1
0
        /// <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);
            }
        }