Приложение WPF, освобождающее ресурсы (изображения) - PullRequest
1 голос
/ 28 ноября 2009

У меня есть приложение для показа слайдов, показывающее несколько изображений. У меня есть простой пользовательский контроль, который отображает изображение. Я читаю изображения из файла XMl и каждый раз создаю новый экземпляр в новом пользовательском контроле и показываю его в своем приложении. В какой-то момент мне нужно «обновить» изображения (например, новую версию), я удаляю все свои пользовательские элементы управления из приложения и «обнуляю» их - затем я пытаюсь удалить все изображения на диске. Однако это дает мне исключение, что ресурс "myimage.png" используется другим процессом и не может быть удален. Что мне нужно сделать, чтобы «освободить» мои ресурсы, чтобы я мог их удалить?

ура

Ответы [ 3 ]

2 голосов
/ 28 ноября 2009

Я посмотрел исходный код WPF с помощью .NET Refector и нашел этот ответ на связанный вопрос , который может быть лучшим решением для вас. Установите для BitmapImage.CacheOption значение BitmapCacheOption.OnLoad принудительно помещает данные изображения в память и немедленно закрывает файл.

Используя эту опцию, вы можете в любое время удалить файл из файловой системы.

1 голос
/ 28 ноября 2009

У меня была похожая проблема - мне нужно было предоставить предварительный просмотр изображения, используя временный файл для изображения. Когда предварительный просмотр был закрыт, я хотел удалить файл.

Я использовал явный поток вместо 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;

Затем, когда пришло время закрыть пользовательский интерфейс и выпустить изображение, я явно закрыл поток:

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);
}
0 голосов
/ 25 июня 2013

Я использовал явный поток вместо 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;

Затем, когда пришло время закрыть пользовательский интерфейс и выпустить изображение, я явно закрыл поток:

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);
}

это решение работает нормально. спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...