0

Première chose: Il s'agit d'une application compacte framework 3.5.NotSupportedException sur la collection générique lorsque le garbage collector appelle clear() (CF 3.5)

J'ai un problème très étrange. Dans une méthode Dispose, l'application dispose des éléments dans une collection et efface ensuite la liste. Jusqu'à présent rien de spécial et ça fonctionne comme un charme quand Dispose est appelé par mon application. Mais dès que le Garbage Collector appelle le Finalizer, qui appelle la même méthode Dispose, le système lève une exception NotSupported sur la méthode Clear de la collection générique.

Voici le corps de la méthode Dispose-Méthode:

public override void Dispose() 
{ 
    if (items != null) 
    { 
     foreach (Shape item in items) 
     { 
      item.Dispose(); 
     } 
     items.Clear(); 
     items = null; 
    } 
    base.Dispose(); 
} 

Je suis totalement coincé ici. Peut-être que quelqu'un peut m'expliquer cela, ou a eu un problème similaire et l'a résolu.

+0

Pourquoi le finaliseur appelez un parameterless Evacuer? Très rarement, un Finalizer doit appeler Dispose sur un autre objet, à moins que l'on sache que la méthode Dispose de l'autre objet fonctionnera utilement dans le contexte d'un thread de finalisation et que l'autre ne se souciera pas de se finaliser. Rien dans votre exemple de code ne suggère que même l'une de ces conditions est remplie. – supercat

Répondre

0

Un finaliseur doit uniquement appeler Dispose s'il y a des ressources non gérées à nettoyer. Vous ne pouvez pas tenter d'accéder aux ressources gérées lorsque vous êtes appelé depuis le finaliseur.

Comme mentionné dans le commentaire ci-dessus, il n'y a aucune raison [que nous pouvons voir] que votre classe devrait implémenter un finaliseur.

Pour référence, si vous avez besoin d'utiliser un finaliseur, le modèle Dispose à utiliser comme suit:

// The finalizer 
~MyClass() 
{ 
    Dispose(false); 
} 

// The IDisposable implemenation 
public void Dispose() 
{ 
    Dispose(true); 
    GC.SuppressFinalize(this); 
} 

// The "real" dispose method 
protected virtual void Dispose(bool disposing) 
{ 
    if (!_disposed) 
    { 
     if (disposing) 
     { 
      // Dispose managed objects here 
     } 
     else 
     { 
      // Free unmanaged resources here 
     } 
     _disposed = true; 
    } 
}