由System.Drawing.Internal.GPStream引起的内存泄漏

本文关键字:内存 泄漏 GPStream System Drawing Internal | 更新日期: 2023-09-27 17:50:11

每当我打开和关闭某个窗体时,我的应用程序总是变大。我使用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);
        }
    }
}

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

任何见解都是赞赏的。请注意,当(我打开和关闭表单)==>内存分配不断增加

由System.Drawing.Internal.GPStream引起的内存泄漏

没有妥善处理的东西。你是否有警告说X类是不可处理的,而你没有处理它?考虑使用'using'块。

参见:

" FileStream包含非托管资源,这些资源实际上可能是在调用Dispose时立即释放。另一个是MemoryStream在它的_buffer变量中存储一个托管字节数组,即在处理时不释放。事实上,_buffer甚至没有被空MemoryStream的Dispose方法,这是一个可耻的错误,因为取消引用可以使内存立即符合GC的条件处理时间。取而代之的是一个挥之不去(但已被处理)的MemoryStream引用仍然保留在内存中。因此,一旦你处理了它,你如果它仍然在范围内,也应该使其无效。"——Triynko 10月25日20:46

如果.NET中的MemoryStream未关闭,是否会产生内存泄漏?

在循环中创建表单会导致问题,这取决于它的构造函数中的代码,它可能会触发将阻塞消息循环的事件。只是为了检查,尝试添加一个应用程序。在循环中执行事件并观察内存是否被释放。

也许您需要重构您的类,以便确定对窗体外部属性的访问。比如:

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

所以你不需要实例化一个Form。

问候,

MarianoC .