2010-10-13 15 views
3

émettre des avis des peuples sur la collecte des ordures de côté sont là des problèmes de supercondamnation ce qui suit:Collecte des ordures à l'intérieur d'un objet de verrouillage

private static readonly object lockObj = new object(); 
lock(lockObj) 
{ 
      ///Load objects into a cache List<object> from DB call 
      GC.Collect(2); 
      GC.WaitForPendingFinalizers(); 
      GC.Collect(2); 
} 
+4

Pourquoi le feriez-vous? Peu importe, n'appelez pas GC.Collect() ... 99/100 vous le faites pour la mauvaise raison –

+0

Merci, mais comme je l'ai dit mettre de côté les opinions des gens ou des vérités sur l'appel explicite GC.Collect .... –

+0

Que le verrouillage le code est également particulièrement inutile. Quel effet essayez-vous même d'atteindre ici? (Inutile parce que deux appelants à ce code se verrouilleront sur deux objets différents) –

Répondre

2

modifier Major, si les commentaires peuvent sembler hors de propos. Désolé pour le dérangement.

Il est difficile de dire avec certitude.

En supposant que le code ressemble à ceci

public class SomeType { 
    private static readonly object Lock = new object(); 

    public void Foo() { 
     lock (Lock) { 
     Console.WriteLine("in foo"); 
     GC.Collect(2); 
     GC.WaitForPendingFinalizers(); 
     GC.Collect(2); 
     } 
    } 

    ~SomeType() { 
     lock (Lock) { 
     Console.WriteLine("in finalizer"); 
     } 
    } 
} 

Vous pourriez obtenir une impasse si vous avez eu plus de cas SomeType comme ils partagent tous un objet statique pour le verrouillage. Vous devez disposer d'au moins une instance non bloquée et non collectée de SomeType et appeler le Foo sur une autre instance. Maintenant, si vous n'avez pas le finaliseur comme ci-dessus, je ne vois pas comment le code pourrait se bloquer.

+0

Seulement si l'extrait est dans le finaliseur !! Virtual -1 .... – Aliostad

+0

J'ai édité l'extrait, je ne verrouille pas réellement sur "ceci" il a été ajouté juste pour garder l'exemple aussi petit que possible –

+0

@Aliostad: Merci d'avoir laissé un commentaire au lieu de simplement voter. Si le code ci-dessus s'exécute sur un thread utilisateur et acquiert le verrou, puis attend l'exécution du finaliseur. Ensuite, si le finaliseur tente de se verrouiller sur le même objet, il bloquera car il est déjà détenu par l'autre thread. –

0

Aucune possibilité de blocage. Mais pourquoi verrouiller cela? Pourquoi le second GC.Collect()?

GC.WaitForPendingFinalizers() est un code de blocage qui ne sera donc pas retourné avant la fin. Donc, je ne suis pas sûr de ce que vous obtenez en bloquant.