2012-04-25 75 views
22

如何釋放此文件上的句柄?釋放文件上的句柄。來自BitmapImage的ImageSource

IMG的類型是System.Windows.Controls.Image的

private void Load() 
{ 
    ImageSource imageSrc = new BitmapImage(new Uri(filePath)); 
    img.Source = imageSrc; 
    //Do Work 
    imageSrc = null; 
    img.Source = null; 
    File.Delete(filePath); // File is being used by another process. 
} 

解決方案


private void Load() 
{ 
    ImageSource imageSrc = BitmapFromUri(new Uri(filePath)); 
    img.Source = imageSrc; 
    //Do Work 
    imageSrc = null; 
    img.Source = null; 
    File.Delete(filePath); // File deleted. 
} 



public static ImageSource BitmapFromUri(Uri source) 
{ 
    var bitmap = new BitmapImage(); 
    bitmap.BeginInit(); 
    bitmap.UriSource = source; 
    bitmap.CacheOption = BitmapCacheOption.OnLoad; 
    bitmap.EndInit(); 
    return bitmap; 
} 
+1

不錯的解決方案。你救了我的一天:) – gisek 2013-01-05 20:43:59

+0

這3行是什麼:img.Source = imageSrc; //做工 imageSrc = null; img.Source = null; – MonsterMMORPG 2013-03-27 11:43:13

+0

@MonsterMMORPG不用擔心它們... bitmap.CacheOption = BitmapCacheOption.OnLoad;是神奇的一部分。 – NitroxDM 2014-04-30 20:15:21

回答

24

發現在MSDN論壇答案。

除非高速緩存選項設置爲 BitmapCacheOption.OnLoad,否則位圖流不會關閉。所以,你需要的東西是這樣的:

public static ImageSource BitmapFromUri(Uri source) 
{ 
    var bitmap = new BitmapImage(); 
    bitmap.BeginInit(); 
    bitmap.UriSource = source; 
    bitmap.CacheOption = BitmapCacheOption.OnLoad; 
    bitmap.EndInit(); 
    return bitmap; 
} 

而當你使用上述方法得到的ImageSource,源文件 將被立即關閉。

see MSDN social forum

+0

對你很好。 – NitroxDM 2012-04-25 16:26:29

+0

如果我使用這段代碼,應用程序的內存增加是否有任何變化? – 2017-06-29 06:17:43

0

我一直運行到這一問題特別麻煩的圖像上。接受的答案不適合我。

相反,我使用了流填充位:

using (FileStream fs = new FileStream(path, FileMode.Open)) 
{ 
    bitmap.BeginInit(); 
    bitmap.StreamSource = fs; 
    bitmap.CacheOption = BitmapCacheOption.OnLoad; 
    bitmap.EndInit(); 
} 

這導致要釋放的文件句柄。

相關問題