0

私は返す関数を持っていますBitmapImage:

    private BitmapImage dfa2bmp(DFA dfa)
    {
        //[...]
        //myGraph.png generated here[...]
        BitmapImage bmp = new BitmapImage();
        bmp.BeginInit();
        bmp.CacheOption = BitmapCacheOption.OnLoad;
        bmp.UriSource = new Uri(graphvizDir + "\\myGraph.png");
        bmp.EndInit();
        File.Delete(graphvizDir + "\\myGraph.png");

        return bmp;
    }

したがって、各呼び出しの後、ファイル myGraph.png は異なります。ただし、戻り値をdfa2bmpImage コントロールに割り当てると、以前の関数の呼び出し中に削除されたにもかかわらず、古いイメージが引き続き取得されます。

私は何を間違っていますか?

4

2 に答える 2

0

bmp.CacheOption = BitmapCacheOption.OnLoad;この行は画像を RAM にキャッシュし、そこから表示しています。ドキュメントは言う;

読み込み時にイメージ全体をメモリにキャッシュします。イメージ データに対するすべての要求は、メモリ ストアから満たされます。

イメージが削除された後にプログラムがそのイメージを使用できないようにする場合は、BitmapCacheOption を none に変更します。それで; bmp.CacheOption = BitmapCacheOption.None;あなたが望むことをします。

編集:これがどのような副作用をもたらすかはわかりません。これらのライブラリを実際に扱っているわけではありませんが、削除された画像を画像コントロールに割り当てようとすると、例外が発生する可能性があります。nullより良い解決策は、GCが画像を含むメモリを解放するオブジェクトを設定することだと思います。

于 2013-05-15T23:29:19.143 に答える