2016-09-16 1 views
0

Ich benutze Nevron Chart in meinem Programm. folgende Code ist in einem Klick-Taste Ereignis:Neue Instanz erstellen verwendet viel Speicher

this.nChartControl1 = new NChartControl(); 
// add data to chart ... 

nach jedem Klick Programm viel Speicher reserviert und sogar GC.Collect() nicht reinigen nicht auf den Speicher, und wenn ich eine Instanz Nevron Chart und jedes Mal, reinigen Sie die Daten und dann neue Daten hinzufügen, alles ist in Ordnung.

Was ist das Problem?

Update 1: Hier ist die Funktion

private void button_Click(object sender, RoutedEventArgs e) 
    { 
     //if (nChartControl1 == null) 
     { 
      this.nChartControl1 = new NChartControl(); 
     } 

     // clear data 
     nChartControl1.Charts.Clear(); 
     nChartControl1.Panels.Clear(); 
     GC.Collect(); 

     // empty the grid then add NevronChart 
     this.grid.Children.Clear(); 
     this.grid.Children.Add(nChartControl1); 

     nChartControl1.BackgroundStyle.FrameStyle.Visible = false; 

     // set a chart title 
     NLabel title = nChartControl1.Labels.AddHeader("2D Line Chart"); 

     // setup chart 
     NCartesianChart chart = new NCartesianChart(); 
     nChartControl1.Panels.Add(chart); 
     chart.DockMode = PanelDockMode.Fill; 
     chart.Margins = new NMarginsL(2, 0, 2, 2); 
     chart.Projection.SetPredefinedProjection(PredefinedProjection.Orthogonal); 
     chart.LightModel.EnableLighting = false; 
     chart.Axis(StandardAxis.Depth).Visible = false; 
     chart.Wall(ChartWallType.Floor).Visible = false; 
     chart.Wall(ChartWallType.Left).Visible = false; 
     chart.BoundsMode = BoundsMode.Stretch; 
     chart.Height = 40; 
     chart.RangeSelections.Add(new NRangeSelection()); 
     chart.Axis(StandardAxis.PrimaryX).ScrollBar.Visible = true; 
     chart.Axis(StandardAxis.PrimaryY).ScrollBar.Visible = true; 

     // setup the line series 
     NLineSeries line = (NLineSeries)chart.Series.Add(SeriesType.Line); 
     //line.Values.FillRandom(new Random(), 10); 
     SetRandomData(line); 

     line.DataLabelStyle.Visible = false; 
     line.Legend.Mode = SeriesLegendMode.DataPoints; 
     line.ShadowStyle.Type = ShadowType.GaussianBlur; 
     line.ShadowStyle.Offset = new NPointL(new NLength(3, NGraphicsUnit.Pixel), new NLength(3, NGraphicsUnit.Pixel)); 
     line.ShadowStyle.FadeLength = new NLength(5, NGraphicsUnit.Pixel); 
     line.ShadowStyle.Color = System.Drawing.Color.FromArgb(55, 0, 0, 0); 
     line.LineSegmentShape = LineSegmentShape.Line; 


     nChartControl1.Controller.Tools.Add(new NSelectorTool()); 
     nChartControl1.Controller.Tools.Add(new NAxisScrollTool()); 
     nChartControl1.Controller.Tools.Add(new NDataZoomTool()); 
     NDataPanTool dpt = new NDataPanTool(); 
     nChartControl1.Controller.Tools.Add(dpt); 
     nChartControl1.Legends.Clear(); 
     nChartControl1.Refresh(); 
    } 
+0

Sie sollten das vorhandene nChartControl1 vor dem Zuweisen einer neuen Instanz zu ihm –

+0

"jedes Mal reinigen Sie die Daten", können Sie genauer erläutern, was dies genau bedeutet? –

+0

@ LasseV.Karlsen I aktualisiert mit der gesamten Funktion – mojtaba357

Antwort

-1

immer ausplanen Speicher, bevor ein neues Stück Speicher zuweisen.

daher: Entsorgen Sie den derzeit zugewiesenen Speicher this.nChartControl, bevor Sie eine neue NChartControl-Instanz erstellen. Sich vollständig auf seinen Müllsammler zu verlassen, ist eine schlechte Praxis, da Müllsammler nicht perfekt sind.

+0

Wenn der Akt des Entsorgens des Diagrammsteuerelements in diesem Fall hilft, dann liegt dies nicht daran, dass der Garbage Collector nicht perfekt ist, sondern weil es immer noch Verweise auf das Diagrammsteuerelement gibt und das Entfernen dieser Referenzen entfernt wird. –

1

Getestet habe ich nur die Steuerung mit dem folgenden Code:

private void button1_Click(object sender, EventArgs e) 
    { 
     for (int i = 0; i < 100000; i++) 
     { 
      using (NChartControl chartControl = new NChartControl()) 
      { 
       // set a chart title 
       NLabel title = chartControl.Labels.AddHeader("2D Line Chart"); 

       // setup chart 
       NCartesianChart chart = new NCartesianChart(); 
       chartControl.Panels.Add(chart); 
       chart.DockMode = PanelDockMode.Fill; 
       chart.Margins = new NMarginsL(2, 0, 2, 2); 
       chart.Projection.SetPredefinedProjection(PredefinedProjection.Orthogonal); 
       chart.LightModel.EnableLighting = false; 
       chart.Axis(StandardAxis.Depth).Visible = false; 
       chart.Wall(ChartWallType.Floor).Visible = false; 
       chart.Wall(ChartWallType.Left).Visible = false; 
       chart.BoundsMode = BoundsMode.Stretch; 
       chart.Height = 40; 
       chart.RangeSelections.Add(new NRangeSelection()); 
       chart.Axis(StandardAxis.PrimaryX).ScrollBar.Visible = true; 
       chart.Axis(StandardAxis.PrimaryY).ScrollBar.Visible = true; 

       // setup the line series 
       NLineSeries line = (NLineSeries)chart.Series.Add(SeriesType.Line); 
       //line.Values.FillRandom(new Random(), 10); 

       line.DataLabelStyle.Visible = false; 
       line.Legend.Mode = SeriesLegendMode.DataPoints; 
       line.ShadowStyle.Type = ShadowType.GaussianBlur; 
       line.ShadowStyle.Offset = new NPointL(new NLength(3, NGraphicsUnit.Pixel), new NLength(3, NGraphicsUnit.Pixel)); 
       line.ShadowStyle.FadeLength = new NLength(5, NGraphicsUnit.Pixel); 
       line.ShadowStyle.Color = System.Drawing.Color.FromArgb(55, 0, 0, 0); 
       line.LineSegmentShape = LineSegmentShape.Line; 


       chartControl.Controller.Tools.Add(new NSelectorTool()); 
       chartControl.Controller.Tools.Add(new NAxisScrollTool()); 
       chartControl.Controller.Tools.Add(new NDataZoomTool()); 
       NDataPanTool dpt = new NDataPanTool(); 
       chartControl.Controller.Tools.Add(dpt); 
       chartControl.Legends.Clear(); 
       chartControl.Refresh(); 
      } 
     } 
    } 

Und es war kein Speicherleck in der Kontrolle. Die Antwort lautet also, dass Sie dispose aufrufen oder eine using-Anweisung verwenden müssen.

+0

funktioniert nicht in meinem Projekt, wirft nicht genügend Arbeitsspeicher. – mojtaba357

Verwandte Themen