Подтвердить что ты не робот

Отпустите дескриптор в файле. ImageSource из BitmapImage

Как я могу освободить дескриптор этого файла?

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;
}
4b9b3361

Ответ 1

Нашел ответ на форуме 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, используя метод выше, исходный файл будет немедленно закрыто.

см. социальный форум MSDN

Ответ 2

У меня все время возникали проблемы с этим особенно тревожным изображением. Принятый ответ не сработал у меня.

Вместо этого я использовал поток для заполнения растрового изображения:

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

Это вызвало освобождение дескриптора файла.