使用PrintDialog.PrintVisual
时遇到一些问题,因为它似乎导致了内存泄漏。
在这个应用程序中,我创建了一个仅用于打印的WPF控件,它从不在屏幕上显示。以下是代码示例:
调用打印
public void PrintDocument()
{
PrintUserControl printControl = new PrintUserControl();
printControl.Print();
}
打印用户控件
public class PrintUserControl
{
public PrintUserControl()
{
InitializeComponent();
}
public void Print()
{
const double width = 5.8 * 96;
const double height = 8.3 * 96;
this.Measure(new Size(width, height));
this.Arrange(new Rect(new Size(width, height)));
this.UpdateLayout();
var dlg = new PrintDialog();
PageMediaSize pageMedia = new PageMediaSize(PageMediaSizeName.ISOA5);
dlg.PrintTicket.PageMediaSize = pageMedia;
dlg.PrintVisual(this, "FooDocument");
}
}
我已经分析了这个应用程序,并且在调用PrintUserControl.Print
方法时,似乎存在内存泄漏,LayoutEventList+ListItem
和ConditionalWeakTable
的许多实例。如果我注释掉PrintUserControl.Print
方法,那么就没有泄漏,但是没有任何打印。
我不会处理我应该做的事情吗?
答案 0 :(得分:0)
所以他们已经得到了适当的清理,但是GC一直没有运行,直到它决定需要它为止。 (这通常是机器内存不足的时候。)
这基本上就是.NET的工作方式,以及垃圾收集语言的工作原理。
优点是您不必担心是否使用Free或删除,或者忘记使用任何内存泄漏;缺点是你的进程使用更多的内存,直到收集器开始清理东西。
它不会运行直到需要清理内容,否则它会从你的应用程序中获取资源(CPU等),而其他地方并不需要它们。只有在某些条件适用时才会这样做,例如可用的系统内存不足。我相信GC决定运行的环境是一个实施细节'并且不应该依赖它们,因为它们将在.NET版本之间进行更改。
合理的是this one from MSDN。您还可以搜索“非确定性最终确定”,当.NET处于iuts原始测试阶段时,其中有许多人已经执行了。