2010-03-30 13 views
1

Nous avons des valeurs stockées dans le cache Cache de la bibliothèque Cache-Enterprise. Les accesseurs de l'élément mis en cache, qui est une liste, modifient les valeurs. Nous n'avons pas voulu que les objets mis en cache soient affectés. Par conséquent, nous avons d'abord retourné une nouvelle liste (IEnumerator of the CachedItem). Cela a permis de s'assurer que les accesseurs ajoutant et supprimant des éléments avaient peu d'effet sur l'élément mis en cache d'origine.L'objet Cloned Cached a des problèmes de mémoire

Mais nous avons trouvé, toutes les instances de la liste que nous avons retourné aux accesseurs étaient ALIVE! Le graphique relationnel d'objet a montré une relation entre cette liste et EnterpriseLibrary.CacheItem.

Nous avons donc changé la déclaration en une liste nouvellement clonée. Pour cela, nous avons utilisé un LINQ dis (à partir de l'élément dans Data select new DataClass (item)) .ToList() même lorsque vous faites comme ci-dessus, l'ORG montre qu'il existe une relation entre cette liste et le CacheItem. Ne pouvons-nous rien faire pour créer un CLONE de l'élément List qui est présent dans le cache de la bibliothèque Enterprise, lequel DOESNT N'A AUCUNE relation avec CACHE ?!

+0

Un type de référence est un type de référence est un type de référence. Ce n'est pas une réponse, juste une déclaration, donc c'est plutôt un commentaire. –

+0

si vous le pouvez, postez le code pour que nous puissions y jeter un coup d'œil. – BlackICE

Répondre

1

Vous devez créer un clone de la liste, c'est-à-dire ajouter un clone de chaque objet dans la liste (et cloner tous les objets qu'ils contiennent, je suggère d'utiliser une méthode Clone() pour cela vous), à une nouvelle liste. Comme cela a été commenté ci-dessus, une référence est une référence, peu importe le nombre de fois que vous la copiez.

+0

Ouais le clonage est mon intention. la classe a uniquement des propriétés de types de valeur. Donc, un LINQ basique devrait faire la magie non? (à partir de l'élément dans Data select new DataClass (item)) .ToList() – ioWint

+0

Enfait je profilé à nouveau SANS Clonage ... Chaque fois que vous récupérez l'élément cache s'il existe et l'envoyer à l'appelant .. nous recevons une nouvelle liste qui est coincé dans la mémoire! avec un graphique de relation d'objet montrant son attaché à CacheItem! – ioWint

+0

la liste elle-même lorsque vous le créez sans cloner ne devrait pas rester bloquée en mémoire, sauf si vous utilisez statique? La nouvelle liste sans clonage devrait être essentiellement une liste de pointeurs vers les éléments mis en cache. – BlackICE

0

Voici comment nous clonons des éléments lorsque vous les sortez du cache. Les objets doivent être marqués sérialisables.

 using (MemoryStream buffer = new MemoryStream()) 
     { 
      BinaryFormatter formatter = new BinaryFormatter(); 
      formatter.Serialize(buffer, objectToClone); 
      buffer.Position = 0; 
      object temp = formatter.Deserialize(buffer); 
      return temp; 
     }