首页 > 解决方案 > 当我绘制图表时,ChartPlotter 内存增加并且从不减少

问题描述

我使用 DynamicDataDisplay.ChartPlotter 绘制图表,每次重绘图表时内存都会增加。因此,当我重绘 200 次时,我的应用程序的图表内存增加到 200 个月。

我尝试手动 GC.Collect() 但没有任何改变。

    private ChartPlotter _courbeChartPlotter;
    public ChartPlotter CourbeChartPlotter
    {
        get { return _courbeChartPlotter; }
        set
        {
            _courbeChartPlotter = value;
            RaisePropertyChanged();
        }
    }

    private static ListPointD3Cs _listeX = new ListPointD3Cs { new Point(0, 0) };
    private static EnumerableDataSource<Point> dsX = new EnumerableDataSource<Point>(_listeX);
    private int nbPoint = 0;

    public void TakeMeasureTest()
    {
        nbPoint++;
        _listeX.Add(new Point(nbPoint, GetRandomNumber(-1, 1)));
        InitDotsCourbe(out dsX);
        TraceCourbe(dsX);
    }

    public void InitDotsCourbe(out EnumerableDataSource<Point> dsX)
    {
        dsX = new EnumerableDataSource<Point>(_listeX);
        dsX.SetXMapping(x => x.X);
        dsX.SetYMapping(y => y.Y);
    }


    public ChartPlotter TraceCourbe(EnumerableDataSource<Point> dsX)
    {
        CourbeChartPlotter = new ChartPlotter();
        ViewPortAxesRangeRestriction restr = new ViewPortAxesRangeRestriction
        {
            XRange = new DisplayRange(0, nbPoint + 1),
            YRange = new DisplayRange(-2, 2)
        };
        CourbeChartPlotter.Viewport.Restrictions.Add(restr);
        CourbeChartPlotter.AddLineGraph(dsX, Colors.Red, 2, "X");
        return CourbeChartPlotter;
    }

我希望每次重绘图表时内存不会增加,或者至少当我GC.Collect()毕竟 Measure 检索正常的内存使用情况时。

标签: c#wpfmemorymvvmgarbage-collection

解决方案


我假设您通过重复调用TraceCourbe方法和重新分配CourbeChartPlotter属性来重绘图表,然后显示它。在这种情况下,您可能有内存泄漏,因为某些东西(例如另一个属性、控件或事件订阅者)ChartPlotter即使在重新分配和理论上删除它之后仍持有对您的控件的引用(您的情况可能与类似)。

您可以改为重新分配图表的数据源,如此处所述


推荐阅读