WPF不在某些计算机上释放内存

时间:2014-10-06 14:01:59

标签: wpf vb.net memory

在某些计算机上,我有一个WPF应用程序在使用它时不会释放内存。例如,当向打印机发送文档时,在大多数计算机上它都会在2-3秒内释放内存(它可能会升高200兆兆位然后再回落),这是正常行为,当打印完成后我会回到我的初始记忆状态。

但是在某些计算机上(安装了超过20台计算机,只有一台计算机给我这个问题),它并没有释放内存。它不断堆积。我不介意看到内存达到1.5 Gb,只要它最终释放它,但它不是,我得到一个OutOfMemoryException。

我没有完全访问有问题的计算机(他们是我们一周前安装的客户端计算机,我们刚看到这个问题)所以我无法真正测试它,但它是标准的Windows 7 Pro x64,拥有10Gb的RAM,除此之外,它的工作就像一个魅力。

此外,它不仅适用于打印。该应用程序是一种PDF查看器,每次为用户加载新页面时,前一页都将从内存中释放。同样,它在大多数PC上运行良好,但在这种情况下不行。

有什么东西可以防止内存被释放吗?我似乎无法在网络上的任何地方找到类似的问题。

编辑:好的,我把电脑拿了一个小时。我能够测试两件事:

  1. GC.Collect()没有安排任何事情(我甚至强迫它使用GC.WaitForPendingFinalizer)
  2. 我尝试在我的Paginator中处理DocumentPage,没有运气。我还保留了一个ViewModel的引用,我用它来打印我的页面,我尝试处理它:没有用。
  3. 我可以说的是,在这两种情况下都必须是因为我的页面中显示的图像。这是我调用以获取新页面图像的函数:

    'First I get the path to the images
    Dim path As String = String.Format("{0}\{1}.png", Me.TemporaryFolderPath, page.PageId)
    Dim imgSource As CachedBitmap
    
    'If the file doesn't exist
    If Not IO.File.Exists(path) Then
         'A function is called which creates the png file for next uses (this way the first loading is slow, but the next times it's faster)
         imgSource = Pdf.GetPageImage(page.PageNumber, path)
    Else
         'If the file exists I instantiate a new BitmapImage
         Dim img As New BitmapImage
    
         'And I load it in a stream
         Using stream As IO.FileStream = IO.File.OpenRead(path)
              'I apply the stream to my image
              img.BeginInit()
              img.CacheOption = BitmapCacheOption.OnLoad
              img.StreamSource = stream
              img.EndInit()
    
              'Flush, close, dispose of my stream
              stream.Flush()
              stream.Close()
         End Using
    
         'And I create a CachedBitmap with this image (which is almost like an ImageSource)
         imgSource = New CachedBitmap(img, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.OnLoad)
         img = Nothing
    End If
    
    'If my ImageSource is something, I freeze it so that the memory is freed afterwards
    If imgSource IsNot Nothing Then imgSource.Freeze()
    
    Return imgSource
    

    所有这些(冻结图像,将cacheOption设置为OnLoad,从流加载)我做了以避免内存泄漏。我第一次尝试加载图像有一个巨大的泄漏,我重构了我的功能,所以我不再有这个问题了。

    那里有什么可能是问题吗?

1 个答案:

答案 0 :(得分:0)

最后我的问题是我将当前的页面图像保存在ReadOnly属性中。即使我正在处理图像(ReadOnly属性使用的局部变量),它也没有释放它。

也许是因为在我的ViewModel上实现了OnPropertyChanged,因为当我把它作为读/写属性并且我处理它并在每次页面更改时将其设置为null时,它就会释放有问题的计算机上的内存。 / p>