C# WPF透明窗口不';关闭时不要处理

C# WPF透明窗口不';关闭时不要处理,c#,wpf,C#,Wpf,我在使用WPF构建的程序中发现了巨大的内存泄漏。我已经编写了一个小示例应用程序,它似乎在更小的范围内复制了这个问题 public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); images = Directory.GetFiles("C:\\Photos", "*.jpg",

我在使用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>
它反复显示并关闭一个包含
位图图像的窗口
,但是“内存不足异常”很快就会发生,所以我显然做错了什么,希望有人能指出

*更新*

在玩了一段时间后,我隔离了该问题,这会导致内存泄漏:

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

莫名其妙-有什么想法吗?

关闭窗口后,仍然有对窗口对象的引用。您需要在关闭
窗口后将其设置为null。

不确定发生上述内存泄漏的确切原因根据我的判断,一切正常


我确实找到了这样一个工具,它可以很容易地循环显示一组图像,而不会出现任何内存泄漏问题。

Taskmgr是一个非常不完善的内存分析器,垃圾收集器和Windows内存管理器都太复杂,不可能被一个数字所猜测。通过运行此代码一百万次来证明您有真正的问题。我已经更新了我的代码,希望能更准确地显示发生了什么。我怀疑我原来的缩减代码没有准确地再现我遇到的问题。请检查此代码:@DavidePiras谢谢,但我不确定需要处理哪些托管资源以及如何处理。@Phil这是在窗口xaml中定义的图像(请参见上面的编辑)删除了对该窗口的所有引用(例如设置
window=null
)仅使
Window1
实例符合垃圾收集的条件。垃圾收集器控制收集的时间和时间以及释放的资源。按照Hans Passant的建议创建一百万个窗口,然后查看资源是否泄漏。我认为我缩小的代码没有反映我实际遇到的问题,因此我已升级你记得冻结位图,所以我看不出你的代码有任何问题(除非你的图像分辨率很高,例如10000 x 10000)。正如Martin和Hans所说,TaskManager不适合任何类型的内存分析。我过去使用过Redgates Ants内存分析程序,而且我发现它很容易使用,我建议您下载trail版本,以便确定导致内存泄漏的确切原因。@Gavimoss最好的方法是使用sos.dll。当您的gram启动,让它运行一段时间,然后运行另一个dumpheap-stat。这将为您提供内存使用位置的清晰指示。
foreach (string image in images)
        {
            Window1 window = new Window1("C:\\Photos\\photo1.jpg");
            window.Show();
            window.Close();
        }