Effacer un dossier avec fichier déjà utilisé

Signaler
Messages postés
9
Date d'inscription
jeudi 1 mai 2008
Statut
Membre
Dernière intervention
13 janvier 2010
-
Messages postés
9
Date d'inscription
jeudi 1 mai 2008
Statut
Membre
Dernière intervention
13 janvier 2010
-
Bonjour ou bonsoir.

Voilà mon problème, j'ai un imageList qui charge plusieurs images, jusque là, tout va bien, il les charge bien, mais le problème, c'est que, quand je veux effacer l'image qui est chargée, il me met qu'elle est déjà utilisé. Pourtant, j'ai bien pris en compte de vider l'imageList avec imageList.Images.Clear();

Quelqu'un peut-il m'aider s'il vous plait ?

10 réponses

Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
85
Bonjour,

La méthode Clear ne fait que retirer les éléments de la collection, rien de plus.
Elle ne se charge pas d'appeler la méthode Image.Dispose, le handle ouvert sur le fichier le reste donc.

/*
coq
MVP Visual C#
CoqBlog
*/
Messages postés
1860
Date d'inscription
lundi 28 novembre 2005
Statut
Modérateur
Dernière intervention
14 février 2015
42
Salut

Comme dit coq, monImage.Dispose(); (sur chaque image) doit fonctionner.
Je suppose également qu'un GC.Collect(); marchera aussi (à condition que tu n'aies plus la moindre référence vers une de tes images.

Krimog : while (!(succeed = try())) ;
- Nous ne sommes pas des décodeurs ambulants. Le style SMS est prohibé. -
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
85
Salut,

Il n'y a cependant aucune garantie qu'un appel à GC.Collect entraine la libération de toutes les images, il vaut mieux donc faire un appel explicite :-)

/*
coq
MVP Visual C#
CoqBlog
*/
Messages postés
1860
Date d'inscription
lundi 28 novembre 2005
Statut
Modérateur
Dernière intervention
14 février 2015
42
Dans tous les cas, Image.Dispose() marchera.

Cependant, je suis étonné par ce que tu dis coq.
En considérant que les images n'aient plus de référence, GC.Collect() entraine la libération des 3 générations, donc de toute la mémoire non référencée, donc de tes images. Ça appellera alors leur méthode Finalize() et donc Dispose(), non ?

Krimog : while (!(succeed = try())) ;
- Nous ne sommes pas des décodeurs ambulants. Le style SMS est prohibé. -
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
85
Effectivement, ma phrase n'est pas claire : je parlais surtout du fait qu'il n'y a pas de garantie que le code de finalisation de la classe Image soit exécuté sur chaque instance suffisament rapidement pour que les handles soient fermés au moment de l'exécution des ordres de suppression de fichiers.
Le thread de finalisation peut être occupé avec une bonne liste d'instances à "finaliser", voire bloqué par l'exécution d'un des codes de finalisation s'il fait une action bloquante.
En général un appel à GC.Collect est couplé à GC.WaitForPendingFinalizers, mais on s'expose à un bon délai, voire une attente infinie.

Ceci dit je ne suis pas non plus certain qu'un appel à GC.Collect garantisse une passe sur l'ensemble des générations, notamment en fonction de la charge CPU de la machine par rapport à son niveau de mémoire disponible.

Bref, utiliser GC.Collect pour ce type de chose est réellement à proscrire car c'est s'exposer inutilement à des éventuels effets de bord dûs à des changements dans l'implémentation interne du GC.


/*
coq
MVP Visual C#
CoqBlog
*/
Messages postés
1860
Date d'inscription
lundi 28 novembre 2005
Statut
Modérateur
Dernière intervention
14 février 2015
42
Merci pour les conseils.
En fait, je pensais surtout que GC.Collect() était bloquant (donc qu'on était sûr que l'instruction suivante ne s'exécuterait qu'une fois les finalizers appelés et la mémoire vidée.

PS : Normalement GC.Collect() équivaut à GC.Collect(2), donc toutes les générations.
PPS : Je me demande si ce post sera plus utile à GoldenSun2 ou à moi ^^

Krimog : while (!(succeed = try())) ;
- Nous ne sommes pas des décodeurs ambulants. Le style SMS est prohibé. -
Messages postés
9
Date d'inscription
jeudi 1 mai 2008
Statut
Membre
Dernière intervention
13 janvier 2010

Up please
Messages postés
9
Date d'inscription
jeudi 1 mai 2008
Statut
Membre
Dernière intervention
13 janvier 2010

Désolé j'ai pas refresh la page . . .
Messages postés
9
Date d'inscription
jeudi 1 mai 2008
Statut
Membre
Dernière intervention
13 janvier 2010

Bon ca va toujours pas, alors je reprends.

Mon bout de code est le suivant

imageList1.Dispose();
            imageList1.Images.Clear();
            visio.Items.Clear();
            for (int i = 0; i < homebrewList.Items.Count; i++)
            {
                if (homebrewList.GetSelected(i) == true)
                {
                    Directory.Delete(@"apps" + homebrewList.Items[i].ToString(), true);
                }
            }
            loadHomebrews(null);


Si je fais comme ça, il ne veut pas supprimer le dossier sélectionné. Mais, si je vide d'abords l'imageList avec Dispose() et que je lance mon code après pour effacer, ça fonctionne. Comment je peux faire ?
Messages postés
9
Date d'inscription
jeudi 1 mai 2008
Statut
Membre
Dernière intervention
13 janvier 2010

J'ai du faire quelques modif et utilisé la méthode GC.Collect() et cella fonctionne parfaitement bien, merci