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>
。 。 。私は明らかに間違って何かを、誰かがそれを指摘することができます願っていますので、その後、ウィンドウ1の繰り返しコード
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();
}
を行いますが
パズルリング - 任意のアイデア???
Taskmgrは*非常に*不完全なメモリプロファイラです。ガベージコレクタとWindowsメモリマネージャは、あまりに洗練されていないため、単一の数値で推測することはできません。このコードを100万回実行することで、あなたが本当の問題を抱えていることを証明してください。 –
何が起きているのかをより正確に示すためにコードを更新しました。元の縮小コードが私が経験している問題を正確に再現していなかったと思われます。 – Gavimoss
これをチェックしてください:http://stackoverflow.com/questions/568408/what-is-the-correct-way-to-dispose-of-a-wpf-window –