0

で開いた画像の削除に問題がありましたPictureBoxHans Passant彼が提案したこのスニペットを使用して、この問題の解決策を得ました。

            using (var temp = new Bitmap(openFileDialog1.FileName))
            {
                pictureBox1.Image = new Bitmap(temp);
            }

コードをクラッシュさせようとしましたが、できなかったので動作しているように見えますが、このコードの背後にあるロジックがよくわかりません。私がやっていた前に:

if (MyImage != null)
                    {
                        MyImage.Dispose();

                    }
...
MyImage = new Bitmap(openFileDialog1.FileName);
                    pictureBox1.Image = (Image)MyImage;

非常にまれでさえ、 で問題を引き起こしましたresource being used

私が使用している新しいコードでこれが起こらないのはなぜですか。カバーの下で何が起こっているのかを理解するために、これを尋ねます。が呼び出されることをusing保証しますが、前のコードでも呼び出されます。ほとんどの場合、リソースは十分に速く解放されますが、新しいコードが常に十分に速くイメージを解放できるようにする大きな違いは何ですか?Dispose()Disposed()

4

1 に答える 1

2

ファイルからオブジェクトを作成するBitmapと、オブジェクトが存在する限り、ファイルは開いたままになりますBitmap

元のコードBitmapでは、コントロール内のファイルから開かれたオブジェクトを使用しているため、コントロールが画像を表示している限り、ファイルは開かれます。

新しいコードでは、ファイルから作成されBitmapたオブジェクトからデータをコピーすることにより、新しいオブジェクトが作成されBitmapます。新しいBitmapオブジェクトは接続をファイルにコピーしないため、最初のBitmapオブジェクトを破棄するとファイルが閉じられます。

少し少ないリソースを使用するソリューションは、ファイルからバイト配列にデータを読み取り、そこからメモリ ストリームを作成し、それを使用してイメージを作成することです。

using (var m = new MemoryStream(File.ReadAllBytes(openFileDialog1.FileName))) {
  pictureBox1.Image = Image.FromStream(m);
}
于 2013-03-11T15:04:04.930 に答える