C# 绘制图表时,绘图仪内存会增加,但不会减少

C# 绘制图表时,绘图仪内存会增加,但不会减少,c#,wpf,memory,mvvm,garbage-collection,C#,Wpf,Memory,Mvvm,Garbage Collection,我使用DynamicDataDisplay.ChartPlotter绘制图表,每次重新绘制图表时,内存都会增加。因此,当我重新绘制200倍的图表时,我的应用程序的内存将增加到200mo 我试图手动执行GC.Collect(),但没有任何更改 private ChartPlotter _courbeChartPlotter; public ChartPlotter CourbeChartPlotter { get { return _courbeChartP

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

我试图手动执行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;
    }
私人海图绘图仪\u库尔贝卡绘图仪;
公共海图绘图仪Courbechart绘图仪
{
获取{return\u courbeChartPlotter;}
设置
{
_Courbechart绘图仪=数值;
RaisePropertyChanged();
}
}
私有静态listpoint3cs _listeX=newlistpoint3cs{new Point(0,0)};
私有静态EnumerableDataSource dsX=新EnumerableDataSource(_listeX);
私有点=0;
公测
{
nbPoint++;
_Add(新点(nbPoint,GetRandomNumber(-1,1));
InitDotScorbe(输出dsX);
TraceCourbe(dsX);
}
public void initdotsburbe(out EnumerableDataSource dsX)
{
dsX=新的可枚举数据源(_listeX);
SetXMapping(x=>x.x);
设置映射(y=>y.y);
}
公共海图绘图仪TraceCourbe(可枚举数据源dsX)
{
CourbeChartPlotter=新图表绘图仪();
ViewPortAxesRangeRestriction=新的ViewPortAxesRangeRestriction
{
XRange=新的显示范围(0,nbPoint+1),
YRange=新的显示范围(-2,2)
};
CourbeChartPlotter.Viewport.Restrictions.Add(restr);
CourbeChartPlotter.AddLineGraph(dsX,彩色,红色,2,“X”);
返回Courbechart绘图仪;
}

我希望每次重画图表时,或者至少在我重新测量正常内存使用情况后,GC.Collect()时,内存不会增加。

我假设您通过反复调用
TraceCourbe
方法重画图表,并重新分配
CourbeChartPlotter
属性,然后显示该属性。在这种情况下,您可能会发生内存泄漏,因为某些内容(例如另一个属性、控件或事件订阅服务器)保留了对
图表绘图仪
控件的引用,即使在重新分配控件并从理论上删除该控件之后(您的情况可能与类似)

您可以改为重新指定图表的数据源,如下所述