コード例 #1
0
ファイル: PrimeFactors.cs プロジェクト: mk-prg-net/Gui2012
        /// <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);
        }
コード例 #2
0
ファイル: PrimeFactors.cs プロジェクト: mk-prg-net/Gui2012
        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);
        }