您的位置:首页 > 其它

Infragistics NetAdvantage 控件资源释放问题的实际经验

2012-10-12 00:20 281 查看
我们对于Infragistics NetAdvantage 的控件使用过的朋友一定都很了解了。非常好用的第三方控件。

我目前使用该控件在8.1.20081.1000版本。

该控件的使用的最多的是对于列表控件、下拉控件、数控件的使用

这里主要说一下有关列表控件Infragistics.Win.UltraWinGrid.UltraGrid 的资源释放的问题。

开发环境vs 2008

语言:c#

项目:Winform

Infragistics.Win.UltraWinGrid.UltraGrid 这个控件是非常强大的,当我们在Winform中引用UltraGrid 后,一般情况下绑定资源后,关闭窗体,在正常使用的时候还不会发现资源释放的一些问题。但是,当在UltraGrid 中使用了下拉列的时候,问题就会出现了。如果UltraGrid 列类型为下拉类型的话,当下拉类型的数据数据源信息比较大的时候(一般大于1w条记录的时候),就会发现UltraGrid 对资源的消耗会比较大。

这里说的列类型是下拉类型是指,将列的编辑控件设置为UltraCombo类型,既:

Infragistics.Win.UltraWinGrid.UltraGridColumn col=......

UltraCombo comb = new UltraCombo();

col.EditorControl = comb;

如下图所示:



如果性别列设定为下拉控件,则如下图结果



以上为举例说明对于列表的列类型的设定方式。

那么,如果上例子中性别列要是数据源不是男女两个记录源,而是1w个枚举值的话,那么就会出现一个问题。当关闭Winform的时候,资源不会被回收,而且在很长时间内,UltraGrid 的资源都不会回收,即使你在Winform窗体的 Closing事件中进行显示释放:UltraGrid .Disposed()资源,UltraGrid 内的资源也不会被完全释放。

这样,当这样的类似窗体打开N多个的时候,就会出现问题了,内存只涨不跌(要是股票就好了^_^)

那么这个问题的引起的原因是什么? 实际上是对UltraGrid 进行的资源释放,但是没有对UltraGrid 中的编辑控件进行显示释放。如果在释放UltraGrid 之前,将列的EditorControl 控件的资源也释放调,那么,GC垃圾才会知道回收这些已经Colse的窗体内的 UltraGrid 还存在的EditorControl 的资源。

这里对于如何处理资源释放具体例子:

/// <summary>

/// 释放列表中的列编辑控件EditorControl中类型为UltraCombo的资源

/// </summary>

/// <param name="bGridDisposed">是否也强制释放掉列表控件资源</param>

public void ClearSource(bool bGridDisposed)

{

if (thisForm.dataGridView1.DataSource != null)

{

foreach (Infragistics.Win.UltraWinGrid.UltraGridColumn c in thisForm.dataGridView1.DisplayLayout.Bands[0].Columns)

{

if (c.EditorControl != null)

{

if (c.EditorControl.GetType() == typeof(UltraCombo))

{

UltraCombo uCombo = (c.EditorControl as UltraCombo);

uCombo.Dispose();

c.EditorControl = null;

}

}

}

if (bGridDisposed)

{

thisForm.dataGridView1.Dispose();

}

//实际上对于资源的显示回收没有其太大作用,一下的语句可不用

GC.Collect();

GC.WaitForPendingFinalizers();

}

}

该函数ClearSource()放在窗体的关闭事件中:

private void TestForm_FormClosing(object sender, FormClosingEventArgs e)

{

ClearSource(true);

}

运行程序,观察任务管理器,你会明显发现,在任务管理器中,进程的资源会在一定的内存点上,(我观察的例子是70-100M之间),当打开N个这样的类似窗体,内存正常到一定的范围后,随窗体的关闭,再创建新的窗体的时候,进程内存会下降并维持在一个稳定的范围内.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐