Utilisation simultanée du dictionnaire

Ai-je raison de penser que c’est l’utilisation correcte d’un dictionnaire simultané?

private ConcurrentDictionary myDic = new ConcurrentDictionary(); //Main thread at program startup for(int i = 0; i < 4; i++) { myDic.Add(i, 0); } //Seperate threads use this to update a value myDic[InputID] = newLongValue; 

Je n’ai pas de verrou, etc. et je ne fais que mettre à jour la valeur dans le dictionnaire même si plusieurs threads essaient de faire la même chose.

    Cela dépend de ce que vous entendez par thread-safe.

    De MSDN – Comment: append et supprimer des éléments d’un ConcurrentDictionary :

    ConcurrentDictionary est conçu pour les scénarios multithread. Vous n’avez pas besoin d’utiliser des verrous dans votre code pour append ou supprimer des éléments de la collection. Cependant, il est toujours possible pour un thread de récupérer une valeur et un autre pour mettre immédiatement à jour la collection en donnant à la même clé une nouvelle valeur.

    Il est donc possible d’obtenir une vue incohérente de la valeur d’un élément dans le dictionnaire.

    Le meilleur moyen de le savoir est de vérifier la documentation MSDN.

    Pour ConcurrentDictionary, la page est http://msdn.microsoft.com/en-us/library/dd287191.aspx

    Sous la section Sécurité des threads, il est indiqué “Tous les membres publics et protégés de ConcurrentDictionary (Of TKey, TValue) sont thread-safe et peuvent être utilisés simultanément à partir de plusieurs threads.”

    Donc, du sharepoint vue de la concurrence, ça va.

    Oui, tu as raison.

    Cela et la possibilité d’énumérer le dictionnaire sur un thread tout en le modifiant sur un autre thread sont les seuls moyens d’existence pour cette classe.

    Cela dépend, dans mon cas, je préfère utiliser cette méthode.

     ConcurrentDictionary.AddOrUpdate Method (TKey, Func, Func); 

    Voir MSDN Library pour les détails d’utilisation de la méthode.

    Exemple d’utilisation:

     results.AddOrUpdate( Id, id => new DbResult() { Id = id, Value = row.Value, Rank = 1 }, (id, v) => { v.Rank++; return v; });