WPF PrintVisual内存泄漏

时间:2014-06-18 13:49:19

标签: c# wpf printing

使用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+ListItemConditionalWeakTable的许多实例。如果我注释掉PrintUserControl.Print方法,那么就没有泄漏,但是没有任何打印。

我不会处理我应该做的事情吗?

1 个答案:

答案 0 :(得分:0)

所以他们已经得到了适当的清理,但是GC一直没有运行,直到它决定需要它为止。 (这通常是机器内存不足的时候。)

这基本上就是.NET的工作方式,以及垃圾收集语言的工作原理。

优点是您不必担心是否使用Free或删除,或者忘记使用任何内存泄漏;缺点是你的进程使用更多的内存,直到收集器开始清理东西。

它不会运行直到需要清理内容,否则它会从你的应用程序中获取资源(CPU等),而其他地方并不需要它们。只有在某些条件适用时才会这样做,例如可用的系统内存不足。我相信GC决定运行的环境是一个实施细节'并且不应该依赖它们,因为它们将在.NET版本之间进行更改。

合理的是this one from MSDN。您还可以搜索“非确定性最终确定”,当.NET处于iuts原始测试阶段时,其中有许多人已经执行了。