2009-11-28 4 views
1

J'ai une application de diaporama montrant quelques images. J'ai un usercontrol simple qui affiche une image. Je lis les images d'un fichier XMl et chaque fois que je crée une nouvelle instance sur un nouveau usercontrol et l'affiche dans mon application. À un moment donné, j'ai besoin de "rafraîchir" les images (par exemple, une nouvelle version) je supprime tous mes contrôles userc de l'application et "null" eux - puis j'essaie de supprimer toutes les images sur le disque. Cependant, cela me donne une exception que la ressource "myimage.png" est utilisée par un autre processus et ne peut pas être supprimée. Que dois-je faire pour "libérer" mes ressources afin de pouvoir les supprimer?Application WPF, libérer des ressources (images)

acclamations,

Répondre

1

j'ai eu un problème similaire - je besoin de fournir un aperçu de l'image en utilisant un fichier temporaire pour l'image. Une fois l'aperçu fermé, je voulais supprimer le fichier.

J'ai utilisé un flux explicite au lieu d'un URI pour charger l'image:

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; 

Puis, quand il était temps de fermer l'interface utilisateur et libérer l'image que je fermais explicitement le flux:

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

J'ai regardé le code source WPF en utilisant .NET Refector et trouvé this answer to a related question qui pourrait être une meilleure solution pour vous. Définissez BitmapImage.CacheOption sur BitmapCacheOption.OnLoad force les données d'image en mémoire et ferme le fichier immédiatement.

Cette option vous permet de supprimer le système de fichiers à tout moment par la suite.

0

J'ai utilisé un flux explicite au lieu d'un URI pour charger l'image:

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; 

Puis, quand il était temps de fermer l'interface utilisateur et libérer l'image que je fermais explicitement le flux:

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

cette solution fonctionne bien. Merci.

Questions connexes