我正在使用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 票数:1

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

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

一个指定打印机功能的MemoryStream

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

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

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

  ask by Bob Allen translate from so

未解决问题?本站智能推荐: