PrintTicket DllHost.exe内存攀升



我使用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的空间永远不会消失。

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

你说你已经把范围缩小到呼叫PrintQueue.GetPrintCapabilitiesAsXml。这是一个好的开始。我们检查一下那个方法的文档看看它返回什么。啊,它返回

指定打印机功能的MemoryStream

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

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

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

最新更新