【问题标题】:PrintTicket DllHost.exe Memory ClimbsPrintTicket DllHost.exe 内存攀升
【发布时间】:2013-04-16 03:46:39
【问题描述】:

我正在使用PrintTickets 打印大量WPF objects,并且打印正常。我们确实有一种情况,据报道,程序正在使用大量的dllhost.exe 内存并爬升直到机器最终崩溃。我已将其缩小到创建PrintTicketprintqueue.getprintcapabilitiesasxml()。每次调用它们时,它都会使dllhost.exe 的内存使用量每次增加 3+ MB。谁能告诉我如果可能的话如何避免这种情况,或者在我知道它被使用后是否有办法清除它?

更新:我用简单的代码创建了一个项目。

for (int i = 0; i < 100; i++)
{
    using (System.Printing.PrintQueue pQueuePrnt = 
    new LocalPrintServer().GetPrintQueue("HP LaserJet 9050 PCL 5"))
    {
        using (MemoryStream printerCapXmlStream = pQueuePrnt.GetPrintCapabilitiesAsXml())
        {
            Console.WriteLine(printerCapXmlStream.Length);
        }
    }
}

这将导致dllhost.exe 中有近 60 MB 永远不会消失。

【问题讨论】:

    标签: .net wpf printing memory-leaks


    【解决方案1】:

    每当您看到无法解释的内存增加时,您首先应该怀疑的是您的代码在某处泄漏了内存。检查您调用的所有函数,跟踪它们的返回值,并确保在完成它们后将它们全部处理掉。

    您说您已将范围缩小到对PrintQueue.GetPrintCapabilitiesAsXml 的调用。这是一个好的开始。因此,让我们检查 the documentation 以查看该方法返回的内容。啊,它回来了

    MemoryStream 指定打印机的功能

    所以现在我们需要找出MemoryStream 到底是什么。特别是,我们需要知道它是否实现了IDisposable interface,因此需要由我们的代码处理。根据the documentation,确实如此,因为MemoryStream 继承自Stream

    大概,您的代码正在检索所有这些新的MemoryStream 对象,然后让它们泄漏它们的非托管资源。您需要为每个对象显式调用Dispose 方法,或者将它们的检索和使用包装在using 语句中;例如

    using (MemoryStream ms = PrintQueue.GetPrintCapabilitiesAsXml())
    {
        ms.DoSomething();
        // ...
    } // the object is automatically disposed here
    

    【讨论】:

    • 我实际上已经在这样做了。一旦它出现这条线,它就会立即向 dllhost.exe 添加内存并且它永远不会消失。我什至可以关闭程序并重新启动它,它会在它停止的 dllhost.exe 内存级别中恢复。当我创建 PrintTicket 时,这也会做同样的事情。一旦我新建了一个 PrintTicket,它将通过向 dllhost 添加内存使用来做同样的事情,并且永远不会消失。
    猜你喜欢
    • 1970-01-01
    • 2017-07-18
    • 1970-01-01
    • 2013-01-19
    • 2014-11-08
    • 1970-01-01
    • 1970-01-01
    • 2013-10-21
    • 2019-09-21
    相关资源
    最近更新 更多