/// <summary> /// Liefert eine Liste aller Primzahlen in einem Intervall [begin, end]. /// Die Suche wird mittels der Task Parallel Library auf einem Multicore- System /// durch Aufteilen in kleine Suchbereiche und absuchen dieser in jeweils einem Thread /// beschleunigt. /// </summary> /// <param name="begin"></param> /// <param name="end"></param> /// <param name="sort"></param> /// <returns></returns> public static TSave.ConcurrentBag <IEnumerable <long> > scanParallelWithParalleForEach(long begin, long end, DGProgress ProgressCallback) { // Suchbereich in Teilbereiche aufteilen, die parallel nach Primzahlen durchsucht werden var partitionen = System.Collections.Concurrent.Partitioner.Create(begin, end); // Liste der Teilergebnisse. Die ConcurrentBag ist threadsafe ! var results = new System.Collections.Concurrent.ConcurrentBag <IEnumerable <long> >(); // Paralleles starten aller Suchaufträge TPL.Parallel.ForEach(partitionen, (part) => { results.Add(scan(part)); // Informieren über die Fertigstellung der Partition Debug.WriteLine("results.Count = " + results.Count); if (ProgressCallback != null) { ProgressCallback(part); } }); return(results); }
public static TSave.ConcurrentBag <IEnumerable <long> > scanParallelWithTasks(long startScope, long endScope, DGProgress ProgressCallback) { var alleTasks = new List <TPL.Task>(); // Die Ergebnisse werden in dieser Liste abgelegt var results = new System.Collections.Concurrent.ConcurrentBag <IEnumerable <long> >(); // Partitionierung des Auftrages for (long start = startScope + 1, ende = startScope + 10000; start < endScope; start += 10000, ende += 10000) { // Pro Partition wird ein Task aufgesetzt var t = new TPL.Task(ParamPartitionAsObject => { // Downcast des Parameters vom Typ Object in den Typ Partition var Arbeitsauftrag = ParamPartitionAsObject as Tuple <long, long>; var result = mko.Algo.NumberTheory.PrimeFactors.scan(Arbeitsauftrag); results.Add(result); // Informieren über die Fertigstellung der Partition if (ProgressCallback != null) { ProgressCallback(Arbeitsauftrag); } }, new Tuple <long, long>(start, ende)); t.Start(); alleTasks.Add(t); } // Warten, bis alle Tasks fertiggestellt sind TPL.Task.WaitAll(alleTasks.ToArray()); return(results); }