3 votes

Appeler dispose dans list.removeAll

Je suis assez novice en matière de programmation C#, et le concept de GC, ainsi que ses relations avec IDisposable, sont encore un peu vagues. Que signifie l'appel à Dispose en termes de collecte des déchets ? Plus précisément, je me demande si le code suivant peut échouer occasionnellement, en fonction du moment où le ramassage des ordures intervient. (Je n'ai pas réussi à le faire planter pendant mes tests).

//List<TestClass2> tc2List;
//TestClass2 invokes a thread. It implements IDisposable. 
//Its Dispose() sets a stop-condition for the thread,
//and joins the thread, awaiting it to stop. (may take 100 msek)

tc2List.RemoveAll(t =>
{
  if (String.Compare(t.Name, "Orange") == 0)
  {
    t.Dispose(); //May take up to 100 msek
    return true;
  }
  return false;
});

4voto

CodesInChaos Points 60274

Votre code fonctionne, mais c'est un mauvais style. Les prédicats ne devraient pas avoir d'effets secondaires. Vous devez donc d'abord disposer des éléments, puis les supprimer.

Predicate<T> filter = t => t.Name == "Orange";
foreach(var t in tc2List.Where(filter))
  t.Dispose();
tc2List.RemoveAll(filter);

2voto

Henk Holterman Points 153608

Je me demande si le code suivant ne risque pas d'échouer occasionnellement, en fonction du moment où le ramassage des déchets intervient.

Non, il n'échouera pas.

//Its Dispose() sets a stop-condition for the thread,
//and joins the thread, awaiting it to stop. (may take 100 msek)

Il s'agit d'une utilisation un peu atypique de Dispose() mais pas mauvaise. Une approche plus efficace consisterait à utiliser une autre méthode Stop() afin de pouvoir arrêter tous les fils en même temps. Ou appelez Dispose() de Parallel.ForEach() . Mais quelle que soit la méthode que vous choisissez, elle n'entrave pas, et n'est pas entravée par, le CG.

1voto

D J Points 2378

Avez-vous la méthode finalize dans votre TestClass2 ?

Déposer les propriétés principales

  1. Ceci doit être implémenté dans les classes implémentant l'interface IDispose.
  2. C'est le bon endroit pour libérer les ressources non gérées comme les fichiers, les handles, les connexions, etc.
  3. La méthode Dispose() est appelée explicitement dans le code lui-même.
  4. La méthode Dispose() est automatiquement appelée (pour les objets qui implémentent IDispose), lorsqu'elle est utilisée dans une méthode "using".

Se référer à lien .

0voto

Soundararajan Points 578

Que signifie l'appel à Dispose en termes de collecte des déchets ?

L'appel de la méthode Dispose signifie que vous nettoyez de force les choses (littéralement la mémoire) à l'aide de votre implémentation de la méthode Dispose. Note : (Certaines classes du framework appellent votre implémentation de Dispose pour vous. System.Windows.Forms.Form par exemple)

La collecte des déchets, en revanche, est une fonctionnalité du runtime .NET qui nettoie automatiquement les choses pour vous. Automatiquement je veux dire, parce que c'est la pression de la mémoire et d'autres facteurs qui sont pris en charge par le runtime.

Une stratégie simple que je recommande. Faites Dispose() si vous pensez que la mémoire restera plus longtemps que nécessaire et aura un impact sur l'application. Sinon, laissez le runtime s'en charger, il nettoiera automatiquement (c'est-à-dire finalisera) les objets lorsqu'ils sortiront du champ d'application. Le GC a son propre algorithme sur la façon de faire le nettoyage, mais vous pouvez dans une large mesure vous y fier.

La question suivante Je me demande si le code suivant ne risque pas d'échouer occasionnellement, en fonction du moment où le ramassage des déchets intervient.

Je suppose que non. L'échec du code dû à la GC dépend de la façon dont vous écrivez le finaliseur de TestClass2. Il est certain que votre appel à t.Dispose() n'entrera pas en conflit avec le GC.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X