Прозрачное окно WPF не закрывается при закрытии - PullRequest
0 голосов
/ 18 февраля 2012

Я вижу огромную утечку памяти в программе, которую я создаю с использованием 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();
        }
    }
}

XAML Window1.,.

<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();
        }

Загадочные - есть идеи ???

Ответы [ 2 ]

0 голосов
/ 19 февраля 2012

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

Мне удалось найти это превосходное руководство по "Многопоточности WPF - Использование BackgroundWorker иСообщение о ходе выполнения в пользовательский интерфейс ", который был легко адаптирован для циклического просмотра и отображения набора изображений без каких-либо проблем с утечкой памяти.

0 голосов
/ 18 февраля 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...