WPF应用程序,释放资源(图像)

时间:2009-11-28 00:20:24

标签: wpf image resources

我有一个幻灯片应用程序显示一些图像。我有一个显示图像的简单用户控件。我从XMl文件中读取图像,每次我在新的usercontrol上创建一个新实例并在我的应用程序中显示它。在某些时候我需要“刷新”图像(例如新版本)我从应用程序中删除所有用户控件并“空​​”它们 - 然后我尝试删除光盘上的所有图像。但是,这给了我一个例外,即资源“myimage.png”正由另一个进程使用,无法删除。我需要做些什么才能“释放”我的资源,以便我可以删除它们?

欢呼声,

3 个答案:

答案 0 :(得分:2)

我使用.NET Refector查看了WPF源代码,发现this answer to a related question可能是更好的解决方案。将BitmapImage.CacheOption设置为BitmapCacheOption.OnLoad将图像数据强制插入内存并立即关闭文件。

使用该选项,您可以随时删除文件系统。

答案 1 :(得分:1)

我遇到了类似的问题 - 我需要使用图像的临时文件提供图像预览。预览关闭后,我想删除该文件。

我使用显式流而不是URI来加载图像:

BitmapImage imageSource = new BitmapImage();

FileStream imageStream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read | FileShare.Delete);

imageSource.BeginInit();

imageSource.StreamSource = imageStream;

imageSource.EndInit();

// imagePreview is a WPF Image
imagePreview.Source = imageSource;

然后,当关闭UI并释放图像时,我明确关闭了流:

BitmapImage imageSource = imagePreview.Source as BitmapImage;
imagePreview.Source = null;

if (null != imageSource)
{
    System.IO.Stream stream = imageSource.StreamSource;

    imageSource.StreamSource = null;

    if (null != stream)
    {
        stream.Close();
    }

    // now the file can be deleted
    File.Delete(filePath);
}

答案 2 :(得分:0)

我使用显式流而不是URI来加载图像:

BitmapImage imageSource = new BitmapImage();

FileStream imageStream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read | FileShare.Delete);

imageSource.BeginInit();

imageSource.StreamSource = imageStream;

imageSource.EndInit();

// imagePreview is a WPF Image
imagePreview.Source = imageSource;

然后,当关闭UI并释放图像时,我明确关闭了流:

BitmapImage imageSource = imagePreview.Source as BitmapImage;
imagePreview.Source = null;

if (null != imageSource)
{
    System.IO.Stream stream = imageSource.StreamSource;

    imageSource.StreamSource = null;

    if (null != stream)
    {
        stream.Close();
    }

    // now the file can be deleted
    File.Delete(filePath);
}

这个解决方案运行正常。感谢。