关闭时不会丢弃WPF透明窗口

时间:2012-02-18 15:14:31

标签: c# 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();
        }

令人费解 - 任何想法???

2 个答案:

答案 0 :(得分:0)

关闭窗口后,您仍然可以参考窗口对象。在关闭它之后,您需要将window设置为null。

答案 1 :(得分:0)

不确定为什么上面的内存泄漏正在发生,因为我可以确定,一切看起来都正确。

我确实设法找到了这个excellent tutorial on "WPF Multithreading - Using the BackgroundWorker and Reporting the Progress to the UI",它很容易适应循环并显示一组图像而没有任何内存泄漏问题。