PrintTicket DllHost.exe内存爬升

时间:2013-04-16 03:46:40

标签: .net wpf printing memory-leaks

我正在使用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的内容永远不会消失。

1 个答案:

答案 0 :(得分:1)

任何时候你看到无法解释的内存增加,你应该怀疑的第一件事是你的代码在某处泄露了内存。检查您调用的所有函数,跟踪它们的返回值,并确保在完成它们时将它们全部丢弃。

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

  

指定打印机功能的MemoryStream

所以现在我们需要找出MemoryStream究竟是什么。特别是,我们需要知道它是否实现IDisposable interface,因此需要通过我们的代码处理。根据{{​​3}},确实如此,因为MemoryStream继承自Stream

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

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