我正在使用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

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

3回复

WPF内存泄漏

我有一个我自己没有创建的WPF表单,所以我不擅长WPF。 它虽然泄漏严重,高达400 MB并且关闭表单无济于事。 问题在于我的应用程序一次加载所有图片。 我想只加载那些可见的。 这是大约300张图片,它们有点大,所以我的WPF格式会受到加载。 我有一个我自己的类型的DataTe
3回复

内存泄漏问题

我在这里有一个快速问题。 有人可以建议我吗? 在以下用例中使用某些控件时,我发现某些控件发生了内存泄漏。 为了复制此内容,我只是准备了一个简单的控制台应用程序来检出它。 当我定义不同的类作为“ MyClass”和“ Class1”替代同一对象“ a”时。 实例的数量每次都会增加,并
1回复

“ContentPresenter.Content”内存泄漏

我正在使用以下内容:VS 2010,.Net 4,WPF和.Net Memory Profiler版本4.6.40.0 Pro。 它们都运行在Win7 64位上。 我一直在使用.Net Memory Profiler来追踪内存泄漏,发现一个我不明白的东西,即使我似乎修复了它。 我们有一个包
1回复

WPF代码中的内存泄漏

我有这段代码,每次单击“主菜单”项时都会运行。 它基本上用“按钮式”用户控件填充子菜单堆栈面板。 我注意到发生的事情是,每次执行此代码时,进程上的内存都会增加几K,而不会降低。 我从阅读中发现,强制垃圾收集可以提供帮助,而且确实可以,但是我也阅读过,这不是一个好习惯,并且想查找泄漏的
5回复

WPF CreateBitmapSourceFromHBitmap()内存泄漏

我需要逐个像素绘制一个图像并将其显示在WPF中。 我试图通过使用System.Drawing.Bitmap然后使用CreateBitmapSourceFromHBitmap()为WPF图像控件创建BitmapSource来做到这一点。 我在某处存在内存泄漏,因为当重复调用CreateBitm
3回复

位图图形CreateBitmapSourceFromHBitmap内存泄漏

我想在带有WPF的Image容器中显示Bitmap 。 问题是,这会造成巨大的内存泄漏。 泄漏发生在CreateBitmapSourceFromHBitmap调用上,并在循环时填充内存,直到超出限制为止。 如果我不使用该电话,则泄漏消失。 知道为什么会发生吗?
4回复

C#WPF中的内存泄漏

处置所有使用的对象后,我需要减少c#WPF中的内存泄漏。 但是我无法通过使用以下代码段来完全减少内存消耗。 这是我的代码: 运行示例后,在任务管理器中对其进行检查时,产生了以下内存消耗读数, 单击“加载”按钮之前:10.0 MB 单击“加载”按钮后:47.8 MB
1回复

WPF MVVM Prism应用程序中的内存泄漏

我有一个使用MVVM Prism编写的WPF应用程序。 它有很多选项卡。 这些选项卡每个消耗大约2..3 MB的内存。 客户抱怨说,打开和关闭几十个选项卡后,该应用程序比一开始就消耗更多的内存。 另外,打开新选项卡需要更多的内存,因此应用程序不使用旧选项卡而是创建新选项卡。 因此,
2回复

WPF C#中的内存泄漏

我正在使用GalaSoft.MvvmLight套件和WPF Toolkit for DataGrid和DatePicker开发WPF MVVM(在v3.5中)应用程序。 但是,每次在MainWindow加载UserControl ,应用程序中都会遇到大量内存泄漏。 我正在尝试通过Scitec
3回复

WPF窗口。关闭内存泄漏

警告:这是我的第一个“真实” WPF应用程序。 我确定这是我在某个地方遇到的逻辑错误,但无法弄清楚应该去哪里。 我有一个自助服务终端类型的应用程序,它循环浏览各种窗口,每个窗口都显示不同类型的数据。 我(目前)通过计时器控制这些,应用程序运行良好,直到最终达到“内存不足”异常。