我在我的程序中使用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();
}
答案 0 :(得分: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语句。
答案 1 :(得分:-1)
在分配新内存之前,始终取消分配内存。
因此:在创建新的NChartControl实例之前,处理当前分配给const text = 'www.abc.com/ff_gg/abc';
const rx = /\/[a-z]{2}_[a-z]{2}\//i;
const index = text.search(rx);
if (index > -1) {
console.log(text.slice(index + 1, index + 1 + 5).split('_'));
}
的内存。完全依赖一个垃圾收集器是不好的做法,因为垃圾收集器并不完美。