【发布时间】:2016-10-03 05:17:23
【问题描述】:
当我在 WinForms 窗口中打开 WPF 窗口时出现内存问题。 目前我正在这样做:
public partial class Form1 : Form
{
MemoryTester.MainWindow wpf_window;
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
wpf_window = new MemoryTester.MainWindow())
wpf_window.Closed += Wpf_window_Closed;
wpf_window.Show();
}
}
它可以正确打开,但是当我关闭窗口时,分配的内存似乎没有被释放。 Visual Studio 诊断工具中分配的进程内存显示,当我打开窗口时,数字增加了约 20MB,但在窗口关闭后从未达到之前的水平。当我在没有 Visual Studio 的情况下启动程序时,在任务管理器中也是如此。
由于 Wpf 窗口没有 Dispose() 方法,我尝试捕获关闭的事件并执行以下操作:
private void Wpf_window_Closed(object sender, EventArgs e)
{
wpf_window.Closed -= Wpf_window_Closed;
wpf_window.Close();
GC.Collect();
}
仍然是相同的行为。 我做错了什么?
【问题讨论】:
-
为什么还要担心释放内存?框架迟早会处理好它。
-
您创建的 WPF 窗口可能太大而无法进入“经典”堆,而是分配到 LOH
LargeObjectHeap。如果 LOH 不能包含新对象,它将扩展。但是当 LOH 中的一个对象被破坏时,它并不会立即减小它的大小。除非您的计算机内存压力过大,否则 AFAIK 不会尝试这样做。您可以尝试在 WPF 窗口打开之前使用内存分析器,在它打开时以及在您关闭它之后检查您的应用程序分配的内存是如何使用的 -
这是实际代码吗?您关闭的处理程序意味着 wpf_window 引用被保留在某个地方?
-
你说得对,我更新了上面的代码。
-
由于 wpf_window 是 Form1 的成员,您需要将其设置为 null 一个您已完成使用它(在窗口关闭后)。更好的是,摆脱类成员并在 button1_click 函数中本地定义它,然后在 Wpf_window_Closed 中将“发送者”转换为 MainWindow。这里的 sender 参数是对您的 wpf 窗口的引用。
标签: c# .net wpf winforms memory