防止在子表单终止时销毁另一个表单引用的对象

时间:2015-12-30 22:08:27

标签: c# winforms garbage-collection

我有以下问题:图表系列数组从一个表单传递到另一个表单以便在子表单中可视化我这样做是为了放大我在主窗口中的图表的查看区域。一切正常,直到我关闭我的系列已经传递到的第二个表单,此时我的应用程序粉碎了一个空对象引用被引发。现在我怀疑我的系列在表单终止时被垃圾收集了。任何想法如何修复和安全地关闭该形式而不破坏数据?

以下是导致创建表单的代码。

Series[] tpSeries = { chart2.Series["S1"], chart2.Series["S2"] };

Dictionary<string, NumericUpDown> netParams = new Dictionary<string, NumericUpDown>()
{ 
 {"N", numVertecies},
 {"S", numS},
 {"R", numR},
 {"Gamma", numGama},
 {"Beta", numBeta},
 {"G", numG},
 {"C0", numCzero},
};

TimePlotAnalysis tpForm = new TimePlotAnalysis(tpSeries, netParams); // N, s, r, gamma, beta, g, c_0 
tpForm.Show();

2 个答案:

答案 0 :(得分:1)

基本上,您的数据应该在单独的类中,然后您只需在表单之间共享一个类实例。

根据您的具体使用情况,有许多不同的方法可以执行此操作。以下是一些例子:

根据您的具体要求,您可能希望将此对象实现为&#34; singleton&#34;:

答案 1 :(得分:1)

  

现在我怀疑我的系列在表单终止时被垃圾收集。

该问题与GC没有任何共同之处。您将从一个表单中的图表控件中获取的Series 对象数组传递到另一个表单,其中(尽管您没有显示)我怀疑您将它们添加到另一个图表控件。

让我们来看看Series班级documentation

  

继承层次结构
  System.Object的
  System.Windows.Forms.DataVisualization.Charting.ChartElement
  System.Windows.Forms.DataVisualization.Charting.ChartNamedElement
  System.Windows.Forms.DataVisualization.Charting.DataPointCustomProperties
  System.Windows.Forms.DataVisualization.Charting.Series

在层次结构之后,这是基类定义

public abstract class ChartElement : IDisposable

注意IDisposable?现在我猜你明白发生了什么。当您关闭第二个表单时,将在表单和所有控件上调用Dispose方法。正确的处置实现将依次调用处理它们所持有的任何一次性对象(我们可以假设MS控制执行正确实现一次性模式)。

很快,我认为传递给第二个表单的Series个对象已被处理掉。

要解决问题,正如Reza Aghaeicomment正确指出的那样,您不应该将Series个对象传递给第二个表单,而是允许在那里重新创建它们的数据。或者至少确保你真正从你传递的 Series 对象中创建。