我使用PrintTickets
来打印大量的WPF objects
,并且打印得很好。我们确实有一种情况,已经报告,其中程序正在使用大量的dllhost.exe
内存和攀升,直到机器最终崩溃。我把范围缩小到创建PrintTicket
和printqueue.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