none
Füllen einer PointCollection mit Parallel.For RRS feed

  • Frage

  • Hallo,
    ich habe folgendes Problem: Ich möchte eine PointCollection mit Punkten füllen… Eigentlich sehr trivial. Da es aber sehr viele Punkte sind, wollte ich dies parallelisieren. Im .Net 4.0 Framework gibt es hierfür z.B. Parallel.For. Hier der Code für die Parallele Verarbeitung:

    public class AxisData
    {
    	public double[][] Modules { get; set; }
    }
    
    
    static PointCollection[][] ConvertToPointCollection1(AxisData[] x, AxisData[] y)
    {
    	var pcList = new PointCollection[x.Length][];
    	//for (int i = 0; i < x.Length; i++)
    	Parallel.For(0, x.Length, i =>
    	{
    		pcList[i] = FillPointCollectionArray1(x[i].Modules, y[i].Modules);
    	}
    	);
    	return pcList;
    }
    
    static PointCollection[] FillPointCollectionArray1(IList<double[]> x, IList<double[]> y)
    {
    	var pcc = new PointCollection[x.Count];
    	//for (int i = 0; i < pcc.Length; i++)
    	Parallel.For(0, pcc.Length, i =>
    	{
    		pcc[i] = FillPointCollection1(x[i], y[i]);
    	}
    	);
    	return pcc;
    }
    
    static PointCollection FillPointCollection1(double[] x, double[] y)
    {
    	var pc = new PointCollection(x.Length);
    	for (int i = 0; i < x.Length; i++)
    	//Parallel.For(0, x.Length, i =>
    	{
    		pc.Add(new Point(x[i], y[i]));
    	}
    	//);
    	return pc;
    }
    


    Mein Problem besteht nun darin, dass die Collection manchmal nicht gefüllt wird, was irgendwie auf ein Thread-Problem hin deutet. Mir ist nur unklar wo.

    Wird der Code so geändert, dass er nur in einem Thread läuft funktioniert er.

    Warum wird die PointCollection nicht richtig gefüllt oder kann mir jemand sagen was ich falsch mache?

    Vielen Dank schon mal.


    Patrick






    Samstag, 13. August 2011 12:12

Antworten

  • Hallo Patrick,

    wenn es sich dabei um eine WPF PointCollection handelt,
    so müsste sie (in der letzten Methode) mit Freeze eingefroren werden,
    da sie ansonsten auf den Thread beschränkt ist, der sie erstellt hat.

    Beschleunigung hin oder her:
    Du solltest prüfen ob die Schachtelung von Parallel.For durch die Methoden wirklich was bringt.
    Zu testen wäre ob es nicht günstiger ist, die PointCollection[] zunächst eindimensional zu erstellen -
    auch wenn das mehr Code bedeuten würde.

    Gruß Elmar

    • Als Antwort markiert P.Arnold Samstag, 13. August 2011 20:22
    Samstag, 13. August 2011 18:06
    Beantworter

Alle Antworten

  • Hallo,

    vermutlich schreiben mehrere Threads in den gleichen Index deiner PointCollection. Versuche bitte mal deine Collection zu synchronisieren, so dass immer nur ein Thread gleichzeitig in die Collection schreiben kann. Oder verwende eine Collection aus dem System.Collection.Concurrent Namespace: http://msdn.microsoft.com/en-us/library/system.collections.concurrent.aspx

    Viele Grüße
    Holger M. Rößler


    Kaum macht man es richtig, schon funktioniert es
    Samstag, 13. August 2011 13:08
  • Hallo Patrick,

    wenn es sich dabei um eine WPF PointCollection handelt,
    so müsste sie (in der letzten Methode) mit Freeze eingefroren werden,
    da sie ansonsten auf den Thread beschränkt ist, der sie erstellt hat.

    Beschleunigung hin oder her:
    Du solltest prüfen ob die Schachtelung von Parallel.For durch die Methoden wirklich was bringt.
    Zu testen wäre ob es nicht günstiger ist, die PointCollection[] zunächst eindimensional zu erstellen -
    auch wenn das mehr Code bedeuten würde.

    Gruß Elmar

    • Als Antwort markiert P.Arnold Samstag, 13. August 2011 20:22
    Samstag, 13. August 2011 18:06
    Beantworter
  • Hallo vielen Dank für eure Antworten.
    Wie Elmar beschrieben hat, muss die PointCollection mit Freeze eingefroren werden, damit sie nicht nur auf einem Thread beschränkt ist.

    Patrick

    Samstag, 13. August 2011 20:21