2013-03-11 26 views
2

Hans Passant給前一個問題的答案,我明白了:使用位圖對象不鎖定資源

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

是,這些代碼放在一個鎖定的文件。該鎖由GDI +創建的內存映射文件對象生成,以便將文件的 像素數據有效映射到內存中,而無需在分頁文件中分配 中的空間。只要 圖像顯示在圖片框中而不會丟棄,您將無法刪除該文件,鎖 可以防止該情況發生。

問題是有關錯誤的(有時)當我試圖從PictureBox刪除以前使用的圖像。看來,在這個確切的情況甚至稱:

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

並不能保證到時候刪除圖像(我猜這可能是任何種類的非託管資源的),它會被佈置。

所以我有兩個問題 - 第一個問題與BitMapPictureBox中使用BitMap以及由此導致的資源鎖定有關。我看到這不是在PictureBox內顯示圖像的唯一方式,所以有另一種方式不會導致此問題,並且可以保證圖像在我需要的時候被釋放並刪除。

我的第二個問題 - 當我必須在.NET中使用非託管資源時,基本方法是什麼,我需要使用它們來執行像Delete這樣的操作。我想這個問題可能出現在.NET中使用任何類型的非託管資源時,是否有一種常見的方法來解決在某個時刻鎖定/釋放資源的問題,而不是在Garbage Collector上進行中繼(這顯然會失敗你時不時,因爲它可能需要不同的時間來釋放)。我看到一些人使用GC...方法明確地調用finilizer之類的東西,但大學提到最好不要使用這些方法,因爲它們可能會導致不可預知的問題。

那麼,任何指導方針,建議?

回答

1

您所描述的「常用方法」是IDisposableDispose()方法,通常通過using公開。如果這不適用於特定示例,那麼在該特定示例中可能存在編碼錯誤。該錯誤不會改變常用的方法。

重新說一個例子;嘗試將其加載到內存中:

var data = File.ReadAllBytes(path); 
var ms = new MemoryStream(data); 
MyImage = Bitmap.FromStream(ms);