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

来源:互联网 发布:软件缺陷生命周期类别 编辑:程序博客网 时间:2024/05/17 08:18

    我们对于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个这样的类似窗体,内存正常到一定的范围后,随窗体的关闭,再创建新的窗体的时候,进程内存会下降并维持在一个稳定的范围内.

原创粉丝点击