50 votes

Est-ce qu'une requête linq vers ConcurrentDictionary Values threadsafe?

disons que j'ai le code suivant:

 ConcurrentDictionary<long, long> myDict= new ConcurrentDictionary<long, long>();
 

Normalement, chaque accès par clé est threadsafe, mais la requête linq suivante est-elle threadsafe? Je n'ai rien trouvé dans les documents: http://msdn.microsoft.com/en-us/library/dd287226.aspx

 if myDict.Values.Any(x => !x.HasPaid))
{
  return false
}
 

47voto

chilltemp Points 3777

Correction... je ne suis pas sûr de vous lorsque vous vous êtes accédant à la propriété de Valeurs. Il est thread-safe lors de l'utilisation de LINQ sur l'objet lui-même.


LINQ va utiliser la méthode GetEnumerator à itterate les éléments.

Le détroit de MSDN

L'agent recenseur est retourné à partir du dictionnaire est sûr à utiliser simultanément avec lit et écrit dans le dictionnaire, cela ne représente cependant pas un moment instantané du dictionnaire. Le contenu exposés par l'agent recenseur peut contenir des modifications apportées dans le dictionnaire après GetEnumerator a été appelé

if myDict.Any(x => !x.Value.HasPaid))
{
  return false
}

44voto

Kevin Points 375

Comme déjà mentionné, ConcurrentDictionary.GetEnumerator () ne représente pas un instantané instantané du dictionnaire. Cependant, ConcurrentDictionary.Values produit un instantané instantané.

Par conséquent, les éléments suivants ne sont pas équivalents:

 myDict.Any(x => !x.Value.HasPaid)
myDict.Values.Any(x => !x.HasPaid)
 

13voto

Jan C. de Graaf Points 71

La documentation du ConcurrentDictionary indique:

Tous les membres publics et protégés de ConcurrentDictionary sont thread-safe et peuvent être utilisés simultanément à partir de plusieurs threads.

Étant donné que la propriété .Values est une implémentation dictée par l'interface IColletion, elle est publique et donc thread-safe.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X