2010-09-21 6 views
2

index de tableau et la longueur je la méthode suivante:LINQ .NET: Vérifiez EXCEPTION

/// <summary> 
/// Gets the specified side of trades. 
/// </summary> 
/// <param name="tradesDictionary">The trades dictionary.</param> 
/// <param name="side">The side.</param> 
public IEnumerable<TradeRecord> GetTrades(Dictionary<Guid, TradeRecord> tradesDictionary, Side side) 
{ 
    return (from tradeRecord in tradesDictionary.Values.ToList().AsParallel() 
      where (tradeRecord.OrderRecord.PairRecord.Id == _pairId) 
       && (tradeRecord.Side == side.ToString()) 
      orderby tradeRecord.Date, tradeRecord.DateCreated, tradeRecord.Id 
      select tradeRecord); 
} 

Ce qui provoque l'exception suivante:

tableau de destination n'est pas assez longtemps pour copier tous les éléments dans la collection . Vérifiez l'index du tableau et longueur.

Le dictionnaire transmis est de taille constamment croissante. Je ne recevais pas l'erreur avant, la seule chose qui a changé est le volume de données dans le tradesDictionary.

  1. Pourquoi cette exception se produit-elle?
  2. Comment puis-je empêcher cela?

Répondre

3

« Le dictionnaire transmis, est en constante augmentation de la taille »

Voulez-vous dire qu'il est en cours de modification alors que vous êtes l'exécution de ce code? C'est un non-non. Je soupçonne l'appel ToList échoue à cause de cela. (Une fois le ToList() exécuté, la liste doit être séparée du dictionnaire.)

Fondamentalement, Dictionary<TKey, TValue> ne prend pas en charge la lecture et l'écriture simultanées. Vous pourriez vouloir regarder ConcurrentDictionary<,> qui vous permet de parcourir dessus pendant qu'un autre fil écrit.

Une suggestion pour améliorer les performances quand tout travail: appeler side.ToString()une fois au début de la méthode, au lieu de à chaque itération de boucle unique.

+0

Merci pour la suggestion Jon. Je veux bien essayer. – c0D3l0g1c

+0

J'ai changé mes objets Dictionnaire volatils en ConcurrentDictionary et je ne reçois plus l'erreur. J'ai aussi fait ce que vous aviez recommandé au début de ma requête - cela améliore les performances, mais est négligeable. Comme le dictionnaire se développe, je suis sûr que le gain de performance deviendra plus visible. Merci encore! – c0D3l0g1c