TabControl与UserControl合伙吃内存

本文讨论了在Windows应用程序中,使用TabControl与UserControl时出现的内存泄漏问题。作者发现每次点击Tree节点加载UserControl时,都会创建新的对象导致内存持续增加。通过改进代码,确保重复点击同一节点时复用已有对象并正确释放资源,成功减少了内存占用。分享这个经验以帮助遇到类似问题的开发者优化程序性能。
摘要由CSDN通过智能技术生成

原文:http://www.cnblogs.com/sufei/archive/2010/04/23/1718260.html       

先说一下问题的所在吧,公司的项目最近发现越来越慢一直找不到原因,主要是在加载 的时候比较慢,如果是512的内存可能要上分钟了,以前是很快的,我打开内存管理 工具一看我的天那200MB,这也太多了,我记得刚开始只有30MB左右,这是怎么回事呢?先看看我们的系统是这样的我放个图片上来吧,

      

左面是一个Tree,右面是一个TabControl,单击Tree里会把一个UserControl添加到TabControl里大家一看应该就明白了

我做了一个测试,才明白,我打开我们的系统一面单击一面看内存变化,我每单击一个项目会增加内存2MB左右,开始我没有认为有什么问题,因为这基本是正常的,可是当我把打开的用户控件再次关闭再打开时发现内存还在增加,再点一下又增加,也就是说单击同一个时在增加内存

   这是怎么回事呢,我看了一直Tree的单击事件才明白

大家可以看一下以下的代码

 

复制代码
  // button's click Tree
         private   void  treeView1_MouseClick( object  sender, MouseEventArgs e)
        {
            
try
            {
                
if  (e.Button  ==  MouseButtons.Left)
                {
                    Point ClickPoint 
=   new  Point(e.X, e.Y);
                    TreeNode CurrentNode 
=  treeView1.GetNodeAt(ClickPoint);
                    
if  (CurrentNode  !=   null ) // 判断你点的是不是一个节点
                    {
                        treeView1.SelectedNode 
=  CurrentNode; // 选中这个节点
                    }

                    
// 如果是上层节点则展开之
                     if  (treeView1.SelectedNode.Parent  ==   null )
                    {
                        
if  (treeView1.SelectedNode.IsExpanded  ==   false )
                        {
                            treeView1.SelectedNode.Expand();
                        }
                    }
                    
else
                    {
                        
// 验证权限不要删除动0不存在1存在2是查询失败
                         if  (user.checkofficeinfoFunction(OfficeInfo.ofPara1, Convert.ToInt32(CurrentNode.ToolTipText.ToString().Trim())
                            , OfficeInfo.ofId) 
==   1 )
                        {
                            
// 加载窗体
                             switch  (CurrentNode.Text.Trim())
                            {
                                
case   " 中国移动 " :
                                    SystemMusic.Mobile(
false );
                                    Mobile Mobile_frm 
=   new  Mobile(OfficeInfo);
                                    Mobile_frm.Parent_Main 
=   this ;
                                    addTabControl(CurrentNode.Text, CurrentNode.Text, MainTabControl, Mobile_frm);
                                    
break ;
                                
case   " 中国联通 " :
                                    SystemMusic.Unicom(
false );
                                    ClientSystem.China_Unicom.Unicom Unicom_frm 
=   new  ClientSystem.China_Unicom.Unicom(OfficeInfo);
                                    Unicom_frm.Parent_Main 
=   this ;
                                    addTabControl(CurrentNode.Text, CurrentNode.Text, MainTabControl, Unicom_frm);
                                    
break ;
                                
case   " 中国电信 " :
                                    SystemMusic.Telecom(
false );
                                    Telecom Telecom_frm 
=   new  China_Telecom.Telecom(OfficeInfo);
                                    Telecom_frm.Parent_Main 
=   this ;
                                    addTabControl(CurrentNode.Text, CurrentNode.Text, MainTabControl, Telecom_frm);
                                    
break ;
                                
case   " 全国缴费 " :
                                    SystemMusic.National_Mobile_Result(
false );
                                    NationalMobile objNationalMobile 
=   new  NationalMobile();
                                    objNationalMobile.OfficeInfo 
=   this .OfficeInfo;
                                    objNationalMobile.Parent_Main 
=   this ;
                                    addTabControl(CurrentNode.Text, CurrentNode.Text, MainTabControl, objNationalMobile);
                                    
break ;
                              
                                
// 在这里添加新的栏目
                                 default :
                                    MessageBoxForm objform 
=   new  MessageBoxForm( " 您没有操作此栏目的权限,如有问题请与服务商联系!!! " " 提示信息 " , MessageBoxIcon.Information);
                                    objform.ShowDialog();
                                    
break ;
                            }
                        }
                        
else
                        {
                            MessageBoxForm objform 
=   new  MessageBoxForm( " 您没有操作此栏目的权限,如有问题请与服务商联系!!! " " 提示信息 " , MessageBoxIcon.Information);
                            objform.ShowDialog();
                        }
                    }
                }
            }
            
catch  (Exception ex)
            {
                MessageBoxForm objform 
=   new  MessageBoxForm( " 提交超时 "   +  ex.Message.ToString(),  "
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值