Effacer un dossier avec fichier déjà utilisé

cs_GoldenSun2 Messages postés 9 Date d'inscription jeudi 1 mai 2008 Statut Membre Dernière intervention 13 janvier 2010 - 10 janv. 2010 à 20:25
cs_GoldenSun2 Messages postés 9 Date d'inscription jeudi 1 mai 2008 Statut Membre Dernière intervention 13 janvier 2010 - 13 janv. 2010 à 22:05
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

cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
10 janv. 2010 à 22:09
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
*/
0
krimog Messages postés 1860 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 14 février 2015 49
11 janv. 2010 à 10:04
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é. -
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
11 janv. 2010 à 20:40
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
*/
0
krimog Messages postés 1860 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 14 février 2015 49
12 janv. 2010 à 09:37
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é. -
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
13 janv. 2010 à 00:29
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
*/
0
krimog Messages postés 1860 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 14 février 2015 49
13 janv. 2010 à 09:39
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é. -
0
cs_GoldenSun2 Messages postés 9 Date d'inscription jeudi 1 mai 2008 Statut Membre Dernière intervention 13 janvier 2010
13 janv. 2010 à 18:20
Up please
0
cs_GoldenSun2 Messages postés 9 Date d'inscription jeudi 1 mai 2008 Statut Membre Dernière intervention 13 janvier 2010
13 janv. 2010 à 18:36
Désolé j'ai pas refresh la page . . .
0
cs_GoldenSun2 Messages postés 9 Date d'inscription jeudi 1 mai 2008 Statut Membre Dernière intervention 13 janvier 2010
13 janv. 2010 à 19:12
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 ?
0
cs_GoldenSun2 Messages postés 9 Date d'inscription jeudi 1 mai 2008 Statut Membre Dernière intervention 13 janvier 2010
13 janv. 2010 à 22:05
J'ai du faire quelques modif et utilisé la méthode GC.Collect() et cella fonctionne parfaitement bien, merci
0
Rejoignez-nous