0

PrintTickets用来打印大量的WPF objects东西,打印效果很好。我们确实有一种情况,据报道,程序正在使用大量dllhost.exe内存并不断攀升,直到机器最终崩溃。我已将其范围缩小到创建 aPrintTicketprintqueue.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。

4

1 回答 1

1

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

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

AMemoryStream指定打印机的功能

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

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

using (MemoryStream ms = PrintQueue.GetPrintCapabilitiesAsXml())
{
    ms.DoSomething();
    // ...
} // the object is automatically disposed here
于 2013-04-16T03:58:04.207 回答