2

前の質問の答えから、Hans Passant私はそれを理解しました:

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

はい、そのコードはファイルをロックします。ロックは、GDI +が作成するメモリマップトファイルオブジェクトによって生成され、ページングファイルにスペースを割り当てることなく、ファイルのピクセルデータをメモリに効率的にマップします。画像が画像ボックスに表示され、破棄されていない限り、ファイルを削除することはできません。ロックにより削除されません。

質問は、以前に使用した画像をから削除しようとしたときのエラー(時々)に関するものでしたPictureBox。この正確な状況では、次のようにさえ呼んでいるようです。

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

イメージを削除するときが来たときに(これはあらゆる種類の管理されていないリソースである可能性があると思います)、イメージが破棄されることを保証するものではありません。

したがって、2つの質問があります。1つは、でBitMapの使用に関する現在の問題とPictureBox、それによって引き起こされるリソースのロックに関連しています。これが内部の画像を表示する唯一PictureBoxの方法ではないことを確認したので、この問題を引き起こさず、必要なときにいつでも画像が解放されて削除されることを保証する別の方法があります。

そして2番目の質問-.NETで管理されていないリソースを操作する必要がありDelete、それらのような操作を行う必要がある場合の基本的なアプローチは何ですか。この問題は、.NETで管理されていないリソースを操作するときに発生する可能性があります。特定の瞬間にリソースをロック/解放し、中継しないという問題を解決するための一般的なアプローチはありますかGarbage Collector(明らかに失敗します)リリースには異なる時間がかかる場合があるため、時々)。GC...明示的に呼び出すためにメソッドを使用するfinilizerものもありますが、大学は、予測できない問題を引き起こす可能性があるため、これらのメソッドを使用しない方がよいと述べています。

では、ガイドラインや提案はありますか?

4

1 に答える 1

1

あなたが説明することへの「一般的なアプローチ」はIDisposable、そしてそのDispose()方法であり、最も一般的にはを介して公開されusingます。特定の例でそれが機能しない場合は、その特定の例にコーディングのバグがある可能性があります。そのバグは一般的なアプローチを変更しません。

その一例です。代わりにメモリにロードしてみてください。

var data = File.ReadAllBytes(path);
var ms = new MemoryStream(data);
MyImage = Bitmap.FromStream(ms);
于 2013-03-11T07:27:40.373 に答える