System.Drawing.Internal.GPStream导致的内存泄漏

时间:2014-03-14 12:30:06

标签: c# winforms memory-leaks idisposable system.drawing

每次打开和关闭某个表单时,我的应用程序的大小都会不断增加。我使用了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);
        }
    }
}

此代码的目的是遍历所有表单并检索控件,以便为用户设置访问权限,以编程方式根据需要激活和停用控件。

任何见解都表示赞赏。 注意 虽然(我正在打开和关闭表格) ==>内存分配不断增加

2 个答案:

答案 0 :(得分:1)

某些事情没有得到妥善处理。您是否有警告说X类是iDisposable并且您没有处置它?考虑使用'使用'块。

见:

  

" FileStream涉及实际上可能的非托管资源   在调用Dispose时立即释放。一个是MemoryStream,另一个是   hand,在其_buffer变量中存储一个托管字节数组,即   没有在处理时释放。事实上,_buffer甚至没有被纳入其中   MemoryStream的Dispose方法,这是一个SHAMEFUL BUG IMO因为   将引用置零可以使内存符合GC的条件   处理时间。相反,一个挥之不去(但处置)的MemoryStream   引用仍然保留在内存中。因此,一旦你处理它,你   如果它仍在范围内,也应该取消它。" - Triynko 10月25日和10日在   20时46分

Is a memory leak created if a MemoryStream in .NET is not closed?

答案 1 :(得分:0)

在循环中创建表单会导致问题,根据其中的代码构造函数,它可以触发会阻塞消息循环的事件。只是要检查,尝试在循环中添加application.doevents并观察是否释放内存。

也许您需要重构您的类才能确定对表单外的属性的访问权限。类似的东西:

Class MyObject
Public my_form as Form
Public Tag as string
end class

因此,您不需要实例化表单。

此致

MarianoC。