子曰 发表于 2015-12-24 16:03:00

Chart 资源析构问题

请问关闭窗口时怎么析构chart资源?每次打开一个新窗口都会让内存不断上升,有什么解决方法?
demo在附件中。

Alice 发表于 2015-12-24 17:29:00

回复 1楼子曰的帖子

谢谢您提供的Demo。
我们需要针对您的Demo进行测试,测试后给您反馈。

Alice 发表于 2015-12-25 14:57:00

回复 1楼子曰的帖子

非常谢谢您的反馈。
经过测试,WPF平台下有内存泄露的情况发生。
我会将此问题提交到产品组,如果有任何反馈会在第一时间通知您。

子曰 发表于 2015-12-25 15:48:00

回复 3楼Alice的帖子

好的,我们这边也挺急的,希望你们能快点。

Alice 发表于 2015-12-25 17:06:00

回复 4楼子曰的帖子

我们已经提交到产品组,如果确认是bug会修复,或是提供相应的方案,我们都会尽快给您反馈。
很抱歉给您带来的不便。

gw0506 发表于 2015-12-29 09:51:00

这不是C1控件的问题,这是.NET机制。比如在window上只放一个MS button,如上操作,情况一样。GC不会再窗口关闭后立即回收。
另外,vshost进程会包含一些debug信息,所以它保留了部分对象,也是无法立即回收的原因。
不过我们提供了一段代码,可以优化这个问题,功能参考

public partial class WindowChart : Window, IDisposable
    {
      public WindowChart()
      {
            InitializeComponent();

            //Chart.Data.Children.Add(new XYDataSeries
            //{
            //    RenderMode = RenderMode.Default,
            //    XValuesSource = ReviewCpetParas.GetInstance().Time,
            //    ValuesSource = ReviewCpetParas.GetInstance().Volume,
            //    ConnectionStrokeThickness = 2,
            //    ConnectionStroke = new SolidColorBrush(Colors.Red),
            //});
            //Chart2.Data.Children.Add(new XYDataSeries
            //{
            //    RenderMode = RenderMode.Default,
         //    XValuesSource = ReviewCpetParas.GetInstance().Time,
            //    ValuesSource = ReviewCpetParas.GetInstance().Flow,
            //    ConnectionStrokeThickness = 2,
            //    ConnectionStroke = new SolidColorBrush(Colors.Red),
            //});

      }

      public void Dispose()
      {
            this.Chart.Content = null;
            this.Chart.View.DataContext = null;
            this.Chart.View = null;
            this.Chart.Data.DataContext = null;
            this.Chart.Data = null;
            this.Chart.DataContext = null;

            this.Chart2.Content = null;
            this.Chart2.DataContext = null;
            this.Chart2.View = null;
            this.Chart2.Data.DataContext = null;
            this.Chart2.Data = null;
            this.Chart2.DataContext = null;

            Root.Children.Clear();
      }

      private void Button_Click(object sender, RoutedEventArgs e)
      {
            Dispose();
            this.Close();
            GC.WaitForPendingFinalizers();
            GC.Collect();
      }
    }

子曰 发表于 2015-12-29 13:09:00

回复 6楼gw0506的帖子

您好,用您的方法我测试了下,还是出现内存一直增加的情况,
因为我们的项目用到的chart比较多,所以这种情况还是不能接受,还可以进行进一步优化吗?

gw0506 发表于 2015-12-29 15:43:00

再没有优化的空间了。原因我也给你讲了,这是.NET GC机制所致,他就是这个样子。
更进一步,更具有针对性的办法还得你这表找了。用antiprofile去分析一下。
页: [1]
查看完整版本: Chart 资源析构问题