C# 释放文件上的句柄。来自BitmapImage的ImageSource

C# 释放文件上的句柄。来自BitmapImage的ImageSource,c#,wpf,xaml,C#,Wpf,Xaml,如何释放此文件的句柄 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); // Fi

如何释放此文件的句柄

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.
}

解决方案



在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时,源文件 将立即关闭


我一直在一张特别令人不安的图片上遇到这个问题。被接受的答案对我不起作用

相反,我使用了一个流来填充位图:

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

这导致文件句柄被释放。

很好的解决方案。你救了我一天:)这三行是什么:img.Source=imageSrc//Do Work imageSrc=null;img.Source=null@MonsterMMORPG不用担心他们。。。bitmap.CacheOption=BitmapCacheOption.OnLoad;如果我使用这段代码,应用程序的内存增加是否有任何变化?
using (FileStream fs = new FileStream(path, FileMode.Open))
{
    bitmap.BeginInit();
    bitmap.StreamSource = fs;
    bitmap.CacheOption = BitmapCacheOption.OnLoad;
    bitmap.EndInit();
}