2014-10-06 88 views
0

在某些計算機上,我有一個WPF應用程序在使用它時不釋放內存。例如,在向打印機發送文檔時,在大多數計算機上,它會在所有2-3秒內釋放內存(它可能會增加200 megs然後再次下降),這是正常行爲,打印完成後,我會返回到我的初始記憶狀態。WPF在某些計算機上不釋放內存

但是在某些電腦上(安裝了20多臺電腦,只有一臺電腦給我這個問題),這並沒有釋放內存。它不斷堆積。我不介意只要內存最終釋放到1.5 Gb,但它不是,我得到一個OutOfMemoryException。

我無法完全訪問有問題的計算機(它們是我們一週前安裝的客戶端計算機,我們只是看到了這個問題),所以我無法真正測試它,但它是標準的Windows 7 Pro x64 ,擁有10Gb的RAM,除此之外,它的功能就像一個魅力。

此外它不是唯一的打印。該應用程序是一種PDF查看器,每次爲用戶加載新頁面時,前一頁將從內存中釋放。再說一次,它在大多數PC上運行良好,但在這種情況下不能。

有什麼可以防止內存被釋放?我似乎無法在網絡上的任何地方找到類似的問題。

編輯:好吧,我抱了一個小時的電腦。我能夠測試兩件事情:

  1. GC.Collect的()沒有安排任何東西(我甚至強迫它GC.WaitForPendingFinalizer)
  2. 我想在我的分頁程序,沒有運氣的DocumentPage處置。我還保留了一個ViewModel的參考資料,用於在打印時顯示我的頁面,我試圖處理它:沒有工作。

我可以說的是,在這兩種情況下,它必須是因爲我的網頁上顯示的圖像。下面是我打電話獲得一個新的頁面圖像的功能:

'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,從流加載)我做以避免內存泄漏。我第一次加載圖像的嘗試有一個巨大的泄漏,我重構了我的功能,所以我沒有這個問題了。

有什麼可能是問題嗎?

+0

假設你試過強迫GC? – 2014-10-06 14:04:47

+0

我不得不承認......我沒有。由於這是不好的做法,我不想強​​制GC.Collect()(這似乎是不必要的,因爲它在大多數計算機上工作)。 – 2014-10-06 14:16:54

+0

我想不出另一種解決「OutOfMemoryExcpetion」的方法,或者通過發送更小的數據包。是否有可能只是「修補」那臺特定的機器,如同它必須有*一些*潛在的問題? – 2014-10-06 14:21:56

回答

0

最後,我的問題是,我保持當前頁面圖像在ReadOnly屬性。即使我正在處理圖像(ReadOnly屬性使用的局部變量),它也不會釋放它。

也許是因爲在我的ViewModels上實現了OnPropertyChanged,因爲當我將它作爲一個讀/寫屬性,並且我在每次頁面更改時將其設置爲null,它就會在有問題的計算機上釋放內存。

相關問題