【发布时间】:2014-04-19 17:54:21
【问题描述】:
每次打开和关闭某个表单时,我的应用程序的大小都会不断增长。我使用 dotTrace 并提出了一个不断增长的 System.Drawing.Internal.GPStream 类型的对象列表,这些对象不断创建字节数组,而不是每次都处理它们。我做了一些研究,发现.net 不支持任何关闭此类内存流的方法。以下
foreach (Type t in Assembly.GetExecutingAssembly().GetTypes())
{
if (t.IsClass && t.BaseType.Name.ToLower() == "form")
{
//Assembly ass = Assembly.GetExecutingAssembly();
object obj = null;
obj = Activator.CreateInstance(t);
Form f = new Form();
f = (Form)obj;
if ((string)f.Tag != "DNI") // Do Not Import
{
DataRow dr = Formsdt.NewRow();
dr["Name"] = f.Name;
dr["Text"] = f.Text;
dr["Tag"] = f.Tag;
Formsdt.Rows.Add(dr);
}
}
}
此代码的目的是遍历所有表单并检索控件,以便为用户设置访问权限,根据需要以编程方式激活和停用控件。
感谢任何见解。 注意 虽然(我正在打开和关闭表单) ==> 内存分配不断增加
【问题讨论】:
-
不要在 .NET 中查找泄漏,而是检查表单中是否存在您正在加载但未处理的任何 GDI 对象(例如位图),或者您正在创建的流而不关闭它们。查看this类似问题
-
没有明确创建流或位图。但是,我确实这样做了,内存泄漏确实是由与内存泄漏一致的 byte[] 组成的。
-
我可以补充一点,我绝对确定这是一个内存 IO 流驱动的问题。
-
通常用于加载位图的内存流,在 System.Drawing 中定义。您确实需要检查表格,12 年后您不太可能是第一个注意到 System.Drawing 泄漏的人。表单是否使用位图或其他 GDI 对象?
-
也许可以试试 Resharper,找到没有发布的资源。
标签: c# winforms memory-leaks idisposable system.drawing