每次打开和关闭某个表单时,我的应用程序的大小都会不断增加。我使用了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);
}
}
}
此代码的目的是遍历所有表单并检索控件,以便为用户设置访问权限,以编程方式根据需要激活和停用控件。
任何见解都表示赞赏。 注意 虽然(我正在打开和关闭表格) ==>内存分配不断增加
答案 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。