Je suis consistant à obtenir cette erreur sur une application multithreading .NET 3.5 P>
Erreur 26 EXCEPTION SHROWARD. Détails: 'system.indexoutofRangeExceptionXception: l'index était en dehors des limites de la matrice. p>
à System.Collections.Generic.Dictionary`2.insert (Touche Twkey, Valeur TValue, Boolean Add) P>
à System.Collections.Generic.Dictionary`2.Ajouter (clé Thkey, valeur TValue) P> blockQuote>
Je pense que je sais comment le réparer (ajouter des serrures où appropriocier) mais j'aimerais pouvoir recréer ce problème sur mon environnement local, donc je serai sûr que je l'ai réparé et que je puisse aussi ajouter un test d'unité pour cela. P>
Connaissez-vous un moyen cohérent de recréer cela? p>
4 Réponses :
Malheureusement, être cohérent dans une application multithreadée où se produisent des conditions de course n'est tout simplement pas réalisable. P>
Les différences matérielles seules entre votre machine et la production, on s'assurera que lorsqu'un problème se produise, il peut ne pas être au même endroit. Même si le matériel est identique, les différences logicielles (en particulier ces services de base) peuvent entraîner des différences de synchronisation et donc une situation où elle n'est tout simplement pas répétable. P>
Heck, si ces threads ont des dépendances sur des ressources externes (comme des appels de dB), les différences de latence de réseau entre la production et votre boîte de test pourraient vous assurer de ne jamais le dupliquer. P>
timide d'avoir un débogueur sur le serveur (mauvaise mauvaise idée), la meilleure chose à faire est une analyse visuelle du code, fixer les pièces que vous jugez nécessaires pour être corrigée, testez-la (aussi bien que vous le pouvez) puis relâchez et regardez-le en production. P>
Dictionary<string, string> dict = new Dictionary<string, string>(); Task.Factory.StartNew(() => { while (true) dict["a"] = "a"; }); Task.Factory.StartNew(() => { while (true) dict.Remove("a"); });
Oui, cela oblige une erreur de dictionnaire, mais en fonction du reste du code de l'OP en jeu et de sa solution proposée, ce n'est pas vraiment utile.
Avec ce code, je suis perfectivement capable de recréer le problème, je ne peux malheureusement pas en dire la même chose avec mon code réel. Marquer la question telle que résolue depuis que je pense que c'est le meilleur que je puisse obtenir sans jeter des centaines de lignes de code au mélange. Merci!
Cela ne vous aidera pas à recréer l'erreur localement, mais de supprimer complètement l'erreur, les documents MSDN pour le générique Dictionnaire
Pour une alternative à thread-Safe, voir ConcurrentRentComment
a>. p> blockQuote> Les docs pour ConcurrentCugerary
Dites: < / p> représente une collection de filetage de paires de la valeur clé pouvant être accessible par plusieurs threads simultanément. p> blockQuote>
Note Cependant, ce concurrentdictionnaire est uniquement disponible en .NET 4 et UP. STRUT> P>
Mon application est 3.5, impossible d'utiliser ConcurrentDictionary code> :(
Pourquoi ne créez-vous pas une enveloppe pour le dictionnaire avec une lecture de lecture. De cette façon, vous avez tous le verrouillage effectué dans une classe. p>
Y a-t-il une raison particulière que vous n'utilisez pas
concurrentdictionner code>?
@Sconibulus: cette application est de 3,5, impossible d'utiliser
ConcurrentDictionary code> :(