private void AddRange(Range range) { var list = new HashSet <Range> { range }; _ranges.AddOrUpdate( Thread.CurrentThread.ManagedThreadId, list, (id, l) => { l.Add(range); return(l); } ); }
public double[] CustomLoop() { _name = nameof(CustomLoop); this.ClearRanges(); int n = _values.Length; var corr = new double[n / 2]; int parallelCount = Environment.ProcessorCount; WorkloadPartitioner partitioner = WorkloadPartitioner.Create(n / 2, loadFactorAtStart: n, loadFactorAtEnd: n * 0.5, Environment.ProcessorCount * this.PartitionMultiplier); IEnumerable <KeyValuePair <long, Range> > partitionEnumerator = partitioner.GetOrderableDynamicPartitions(); var tasks = new Task[parallelCount]; tasks[0] = new Task(Loop, partitionEnumerator); for (int i = 1; i < parallelCount; ++i) { tasks[i] = Task.Factory.StartNew(Loop, partitionEnumerator); } tasks[0].RunSynchronously(); Task.WaitAll(tasks); return(corr); //----------------------------------------------------------------- void Loop(object _) { foreach (KeyValuePair <long, Range> partition in _ as IEnumerable <KeyValuePair <long, Range> > ) { Range range = partition.Value; this.AutoCorrelationToArrayImpl(corr, range); } } }