2010-02-15 3 views
4

J'ai un dictionnaire trié, qui stocke certaines données. Toutes les deux minutes environ, je fais ce qui suit:.ToList exception de lancement

sorteddcitionary.Values.ToList() ----> Cette ligne jette parfois une exception. Ce n'est pas cohérent. L'exception est la suivante:

System.IndexOutOfRangeException: Index was outside the bounds of the array. 

at System.Collections.Generic.SortedDictionary`2.ValueCollection.<>c__DisplayClass11.CopyTo>b__10(Node node) 
at System.Collections.Generic.TreeSet`1.InOrderTreeWalk(TreeWalkAction`1 action) 
at System.Collections.Generic.SortedDictionary`2.ValueCollection.CopyTo(TValue[] array, Int32 index) 
at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection) 
at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source) 
at Aditi.BMCMUtility.UnModCacheMaster.MessageAddition(PrivateMessage message, Nullable`1 cnt) 

Une idée de la raison pour laquelle cette exception provient du code .NET LINQ?

Il est dans un verrou. Je poste l'extrait de code. (Ceci est après la réponse de bzlm.)

try 
{ 
    lock (locker) 
    { 
     MessageCache.Add(message.MessageID, message); 
     privMsgList = MessageCache.Values.ToList(); /// Line which throws exception 
     while (MessageCache.Count > cnt.Value) 
     { 
      MessageCache.Remove((MessageCache.First().Key)); 
     } 
    } 
} 
catch(Exception ex) 
{} 

Répondre

4

Il se pourrait que la collection est modifiée en même temps qu'elle est réitérée. Si plusieurs threads accèdent à ce code simultanément, il se peut que vous deviez verrouiller la liste pour des modifications lors de l'itération.

+0

Non, c'est dans un verrou. J'ai mis à jour ma question après avoir vu votre réponse. – Prashant

+0

Veuillez montrer comment 'locker' est défini. En outre, mon souci était que le code * ailleurs * modifie 'MessageCache'; n'y a-t-il aucun risque de cela? – bzlm

1

Le verrouillage pendant le ToList n'est pas suffisant. Vous devez également verrouiller (le même objet!) Lors de la modification.

Questions connexes