我正在使用WPF应用程序,我有一个方法让我们称之为 GetUIElement(),我的方法返回 CustomUserControl ,并且我有一个for循环,我在其中调用 GetUIElement ,问题是当我在for循环中进行1000次迭代时,我的应用程序会消耗太多内存。
PS:
在 CustomUserControl 的构造函数和析构函数中,我放了一些调试代码来了解我的对象的生命周期,我看到它们都被同时销毁了在循环之后,我解释了为什么我的应用程序消耗了太多内存,它们都被保存在内存中直到循环结束。 我希望我很清楚,不要犹豫,告诉我你是否想要更多解释。 以下是代码的一些部分:
foreach (var item in Data)
{
var element = GetUIElement(item);
//...
}
public FrameworkElement GetUIElement()
{
CustomUserControl control = new CustomUserControl();
control.StartButton.Style = Application.Current.Resources["StandardButton"] as Style;
return control;
}
答案 0 :(得分:1)
从您所显示的内容中没有任何错误,GC不会因为某个对象被取消引用而自动启动。如果出现问题,您显示的代码不是其中的一部分。
如果你有一个真正的泄漏,它可能是到那个创建的控件存储/ ref在其他地方。
答案 1 :(得分:0)
你可以打电话给垃圾:
System.GC.Collect();
但是,我只是想说,如果你真的需要它,你的代码似乎很奇怪...... 您知道可以使用自定义项模板创建ListBox吗?
答案 2 :(得分:0)
为什么你认为你的应用程序消耗了太多内存?
GC会在需要时收集内存。
如果GC正在等待收集循环结束,那是因为GC确定它在循环中不需要内存。
如果内存在循环结束时回落,则没有内存泄漏。
任务管理器报告了多少内存?
因此,您的应用会消耗1.5 GB的内存 GC可能仍在继续工作 它正在收集内存然后它需要。
您的应用正在消耗如此多的资源,导致您无法运行其他应用程序。 这并不意味着GC没有做好自己的工作。
您丢弃的1000个用户控件的用途是什么?
你可以这样做,但它不会修复你的程序
foreach (var item in Data)
{
using (var element = GetUIElement(item))
{
//...
}
System.GC.Collect();
}