2014-10-06 3 views
0

На некоторых компьютерах у меня есть приложение WPF, которое не освобождает память при работе с ним. Например, при отправке документа на принтер, на большинстве компьютеров он освобождает память на все 2-3 секунды (это происходит, возможно, 200 мегабайт, а затем возвращается), что является нормальным поведением, и когда печать выполняется, я возвращаюсь к мое начальное состояние памяти.WPF не освобождает память на определенных компьютерах

Но на некоторых компьютерах (более 20 компьютеров установлены, и только один дает мне эту проблему), это не освобождает память. Он продолжает накапливаться. Я не против видеть, что память идет до 1,5 Гб, пока она выпускает ее в конце, но это не так, и я получаю исключение OutOfMemoryException.

У меня нет полного доступа к проблемному компьютеру (это компьютер клиента, который мы установили неделю назад, и мы только что видели эту проблему), поэтому я не могу его протестировать, но это стандартный Windows 7 Pro x64 , с 10 ГБ ОЗУ и, кроме того, он работает как шарм.

Также это не ТОЛЬКО при печати. Приложение является видом просмотра PDF-файлов, и каждый раз, когда для пользователя загружается новая страница, предыдущая страница освобождается из памяти. Опять же, он работает нормально на большинстве ПК, но не в этом случае.

Есть ли что-то, что может помешать освобождению памяти? Кажется, я не могу найти подобную проблему в любом месте в Интернете.

EDIT: Хорошо, я задержался на компьютере в течение часа. Я был в состоянии проверить две вещи:

  1. GC.Collect() ничего (я даже заставил его GC.WaitForPendingFinalizer)
  2. Я попытался выбрасывании DocumentPage в моем Paginator, не повезло не устраивает. Я также сохранил ссылку на 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? –

+0

Должен признаться ... Я этого не сделал. Поскольку это плохая практика, я не хотел использовать GC.Collect() (что казалось ненужным, поскольку оно работает на большинстве компьютеров). –

+0

Я не могу придумать другой способ решения «OutOfMemoryExcpetion», кроме этого, или путем отправки меньших пакетов. можно ли просто «запланировать» эту конкретную машину, поскольку obvoiusly она должна иметь * некоторую * основную проблему? –

ответ

0

Наконец-то моя проблема заключалась в том, что я сохранял текущее изображение страницы в свойстве ReadOnly. Несмотря на то, что я удалял изображение (локальная переменная, используемая свойством ReadOnly), он не выпускал его.

Возможно, из-за OnPropertyChanged, реализованного на моих моделях ViewModels, поскольку, когда я сделал это свойством чтения/записи, и я удалил его и установил для него значение null при каждом изменении страницы, он освобождал память на проблемных компьютерах.

Смежные вопросы