【问题标题】:Create new instance uses much memory创建新实例占用大量内存
【发布时间】:2017-01-24 14:54:02
【问题描述】:

我在我的程序中使用 Nevron Chart。以下代码在点击按钮事件中:

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

在每次点击程序分配大量内存之后,甚至GC.Collect() 也不会清理内存,如果我使用 Nevron Chart 的一个实例并且每次都清理数据然后添加新数据,一切都可以。

有什么问题?

更新 1:这里是函数

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();
    }

【问题讨论】:

  • 您应该在分配一个新实例之前处理现有的 nChartControl1
  • “每次都清理数据”,你能详细说明一下这是什么意思吗?
  • @LasseV.Karlsen 我更新了整个函数
  • @AlexK。我试过了,但没有效果!
  • 分配了多少内存以及如何检查?

标签: c# memory memory-management nevron


【解决方案1】:

我刚刚使用以下代码测试了控件:

    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();
            }
        }
    }

并且控件中没有内存泄漏。所以答案是你需要调用 dispose 或者使用 using 语句。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-11
    • 2011-02-27
    • 2013-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多