窗口界面上有一个picturebox控件,该控件显示的是一些平面图,大概每隔10秒会让该picturebox控件加载不同的平面图,然后从数据库里读取要在该平面图上显示的一些记录,根据记录在这个picturebox上动态创建一些小的picturebox控件作为监控点,代码如下:               //把平面图上已经显示的监控点图标清空
                foreach (Control cl in ptbMap.Controls)
                {
                    ptbMap.Controls.Remove(cl);
                    cl.Dispose();
                }
                ptbMap.Controls.Clear();                //初始化平面图显示区域的资源
                if (ptbMap.Image != null)
                {
                    ptbMap.Image.Dispose();
                    ptbMap.Image = null;
                }                ptbMap.Image = OperTextResource.LoadLocalImage(Application.StartupPath, mapFile);                PictureBox ptbEqu = new PictureBox();
                        ptbEqu.BackColor = System.Drawing.Color.Transparent;
                        ptbEqu.Cursor = Cursors.Arrow;
                        ptbEqu.SizeMode = PictureBoxSizeMode.AutoSize;
                        ptbEqu.Tag = hexRecordValuesSplit1[0];
                        ptbEqu.Name = "ptbEqu" + hexRecordValuesSplit1[0];
ptbMap.Controls.Add(ptbEqu);ptbEqu.Location = ptbCur;
                        ptbEqu.ContextMenuStrip = cMenu;
                        ptbEqu.Visible = true;//注册监控图标的事件
                        ptbEqu.MouseEnter += new System.EventHandler(PtbEqu_MouseEnter);
                        ptbEqu.MouseDown += new System.Windows.Forms.MouseEventHandler(PtbEqu_MouseDown);
结果在运行了两天后,出现“创建窗口句柄时出错”,出错的语句是在ptbMap.Controls.Add(ptbEqu)这里,内存也不断增加,请问各位高手,怎么解决资源回收问题。

解决方案 »

  1.   

    没时间仔细研究,但我认为你可以在释放资源前把事件委托松绑,类似:
    ptbEqu.MouseEnter -= new System.EventHandler(PtbEqu_MouseEnter);
    ptbEqu.MouseDown -= new System.Windows.Forms.MouseEventHandler(PtbEqu_MouseDown);
      

  2.   

    没时间仔细研究,但我认为你可以在释放资源前把事件委托松绑,类似:
    ptbEqu.MouseEnter -= new System.EventHandler(PtbEqu_MouseEnter);
    ptbEqu.MouseDown -= new System.Windows.Forms.MouseEventHandler(PtbEqu_MouseDown);
      

  3.   

    不知道楼主解决没有,我也遇到同样的问题,在csdn上也没有搜索的解决的答案。
    现在我解决了,把方法贴出来,方便以后大家解决这个问题。原因是楼主这段代码有问题,没有完全释放控件
    foreach (Control cl in ptbMap.Controls)
    {
      ptbMap.Controls.Remove(cl);
      cl.Dispose();
    }正确的释放控件写法是:
    Panel parentControl = panel_Bottom_Customer;//你的容器控件                      
    while (parentControl.Controls.Count > 0)
    {
       if (parentControl.Controls[0] != null)                 
           parentControl.Controls[0].Dispose();                 
    }
      

  4.   

    在foreach 中改变,没有错?
    foreach (Control cl in ptbMap.Controls)
      {
      ptbMap.Controls.Remove(cl);
      cl.Dispose();
      }