2012-02-18 38 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> 

。 。 。私は明らかに間違って何かを、誰かがそれを指摘することができます願っていますので、その後、ウィンドウ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(); 
     } 
を行いますが

パズルリング - 任意のアイデア???

+3

Taskmgrは*非常に*不完全なメモリプロファイラです。ガベージコレクタとWindowsメモリマネージャは、あまりに洗練されていないため、単一の数値で推測することはできません。このコードを100万回実行することで、あなたが本当の問題を抱えていることを証明してください。 –

+0

何が起きているのかをより正確に示すためにコードを更新しました。元の縮小コードが私が経験している問題を正確に再現していなかったと思われます。 – Gavimoss

+0

これをチェックしてください:http://stackoverflow.com/questions/568408/what-is-the-correct-way-to-dispose-of-a-wpf-window –

答えて

0

ウィンドウを閉じると、まだウィンドウオブジェクトへの参照があります。閉じた後にwindowをnullに設定する必要があります。

+0

ありがとうございましたが、私はそれを試しましたが、ウィンドウはまだメモリに残っています – Gavimoss

+0

ウィンドウへのすべての参照を削除すると(例えば 'window = null'を設定する)、' Window1'インスタンスはガベージコレクションの対象になります。それが収集され、リソースが解放された場合は、ガベージコレクタによって制御されます。 Hans Passantが提案する100万のウィンドウを作成し、リソースが漏れていないかどうかを確認します。 –

+0

私の縮小したコードは私が実際に持っている問題を反映していないと思いますので、何が起こっているのかをより正確に表示するように更新しました。 – Gavimoss

関連する問題