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