窗口界面上有一个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)这里,内存也不断增加,请问各位高手,怎么解决资源回收问题。
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)这里,内存也不断增加,请问各位高手,怎么解决资源回收问题。
解决方案 »
- C#统计Ayyaylist中相同元素出现的次数并排序
- 关于Linq的一些疑问
- 退出对话框
- 如何在windows64位系统上运行access
- 继承TextBox自定义DataGridView列输入数据后怎样在离开焦点时提交,而不是每输一个字母就提交。
- iis能通过VS2010生成framework2.0的网站而访问aspx,V3.5也可以。但不能访问framework4.0中
- 多文档中 我怎么获得一个窗体 然后激活显示当前呢
- 写16进制文件的问题
- 数据库创建时的一个问题
- 在vistual studio里如何制作website的更新程序?
- 统计某表分页总数GetCount为什么这么调用?
- 在一个表单中有一个textbot控件,在报表的load事件中如何使用其值
ptbEqu.MouseEnter -= new System.EventHandler(PtbEqu_MouseEnter);
ptbEqu.MouseDown -= new System.Windows.Forms.MouseEventHandler(PtbEqu_MouseDown);
ptbEqu.MouseEnter -= new System.EventHandler(PtbEqu_MouseEnter);
ptbEqu.MouseDown -= new System.Windows.Forms.MouseEventHandler(PtbEqu_MouseDown);
现在我解决了,把方法贴出来,方便以后大家解决这个问题。原因是楼主这段代码有问题,没有完全释放控件
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();
}
foreach (Control cl in ptbMap.Controls)
{
ptbMap.Controls.Remove(cl);
cl.Dispose();
}