2012-02-18 5 views
0

Я вижу огромную утечку памяти в программе, которую я создаю с помощью WPF. Я написал небольшое примерное приложение, которое, похоже, реплицирует эту проблему в меньших масштабах.WPF прозрачное окно не удаляется при закрытии

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 

     images = Directory.GetFiles("C:\\Photos", "*.jpg", 
                SearchOption.TopDirectoryOnly); 
     foreach (string image in images) 
     { 
      Window1 window = new Window1(image); 
      window.Show(); 
      window.Close(); 
     } 
    } 
} 

Window1 XAML. , ,

<Window x:Class="WpfApplication1.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Window1" 
    AllowsTransparency="True" 
    WindowStyle="None" 
    Background="White" 
    Opacity="1.0" 
<Grid> 
    <Image Name="pb_Image"/> 
</Grid> 

. , , и Window1 код

public Window1(string image) 
    { 
     InitializeComponent(); 
     BitmapImage bi = new BitmapImage(new Uri(image, UriKind.Absolute)); 
     bi.Freeze(); 
     pb_Image.Source = bi; 
     pb_Image.Height = bi.Height; 
     pb_Image.Width = bi.Width; 
    } 

Многократно показывает, а затем закрывает окно, которое содержит BitmapImage однако «вне исключения памяти» происходит очень быстро, так что я, очевидно, делает что-то неправильно, и надеясь, что кто-то может указать его!

* Обновление *

После игры вокруг некоторое время я изолировал проблему, это вызывает утечку памяти:

foreach (string image in images) 
     { 
      Window1 window = new Window1(image); 
      window.Show(); 
      window.Close(); 
     } 

и это не

foreach (string image in images) 
     { 
      Window1 window = new Window1("C:\\Photos\\photo1.jpg"); 
      window.Show(); 
      window.Close(); 
     } 

Puzzling - любые идеи ???

+3

Taskmgr является * очень * несовершенным профилировщиком памяти, как сборщик мусора, так и диспетчер памяти Windows, слишком сложны, чтобы уклоняться от второго числа одним числом. Докажите, что у вас есть настоящая проблема, запустив этот код миллион раз. –

+0

Я обновляю свой код, надеюсь, более точно покажу, что происходит. Я подозреваю, что мой оригинальный уменьшенный код не точно воспроизводил проблему, которую я испытываю. – Gavimoss

+0

проверьте этот: http://stackoverflow.com/questions/568408/what-is-the-correct-way-to-dispose-of-a-wpf-window –

ответ

0

Не уверен, почему именно эта утечка памяти происходит из того, что я могу определить, все выглядит правильно.

Мне удалось найти это excellent tutorial on "WPF Multithreading - Using the BackgroundWorker and Reporting the Progress to the UI", которое было легко адаптировано для циклического просмотра и отображения набора изображений без каких-либо проблем с утечкой памяти.

0

Как только вы закроете окно, у вас все еще есть ссылка на объект окна. Вам необходимо установить window в null после того, как вы его закрыли.

+0

Спасибо, но я пробовал это, и окно все еще остается в памяти. – Gavimoss

+0

Удаление всех ссылок на окно (например, установка 'window = null') делает экземпляр« Window1 »подходящим для сбора мусора. Если и когда он собирается, и его ресурсы освобождаются контролируемым сборщиком мусора. Создайте миллион окон, как подсказывает Ханс Пассант, а затем посмотрите, не утечка ресурсов. –

+0

Я думаю, что мой уменьшенный код не отражает проблему, которую я действительно имею, поэтому я обновил ее, чтобы более точно показать, что происходит. – Gavimoss

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