Is een linq-query naar ConcurrentDictionary Values ​​threadsafe?

laten we zeggen dat ik de volgende code heb:

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

Normaal gesproken is elke toegang met een sleutel threadsafe, maar is de volgende linq-query ook threadsafe?
Ik heb niets gevonden in de documenten:
http://msdn.microsoft.com/en-us/library/dd287226.aspx

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

Antwoord 1, autoriteit 100%

Correctie… Ik weet niet zeker wanneer je de eigenschap Values ​​opent. Het is thread-safe bij gebruik van LINQ op het object zelf.


LINQ gebruikt de GetEnumerator-methode om de items te herhalen.

Rechtstreeks van MSDN

De enumerator die uit het woordenboek wordt geretourneerd, kan veilig worden gebruikt in combinatie met lezen en schrijven naar het woordenboek, maar het vertegenwoordigt geen momentopname van het woordenboek. De inhoud die via de enumerator wordt weergegeven, kan wijzigingen bevatten die in het woordenboek zijn aangebracht nadat GetEnumerator werd aangeroepen

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

Antwoord 2, autoriteit 92%

Zoals reeds vermeld, vertegenwoordigt ConcurrentDictionary<TKey, TValue>.GetEnumerator()geen momentopname van het woordenboek. ConcurrentDictionary<TKey, TValue>.Valuesproduceert echter wel een momentopname.

Daarom zijn de volgende niet equivalent:

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

Antwoord 3, autoriteit 27%

In de documentatie van de ConcurrentDictionary staat (MSDN):

Alle openbare en beschermde leden van ConcurrentDictionary zijn thread-safe en kunnen gelijktijdig worden gebruikt vanuit meerdere threads.

Aangezien de eigenschap .Values ​​een implementatie is die wordt gedicteerd door de IColletion-interface, is deze openbaar en daarom threadveilig.


Antwoord 4, autoriteit 16%

Alle antwoorden tot nu toe zijn geweldig en nuttig, maar ik denk dat de link die DuneCat aanwees in een van de opmerkingen de nadruk legt:

http://geekswithblogs. net/simonc/archive/2012/02/22/inside-the-concurrent-collections-concurrentdictionary.aspx

Specifiek…..

Zonder slot:

  • TryGetValue
  • GetEnumerator
  • De indexeerder
  • BevatSleutel

Haalt elk slot uit (lockfull?):

  • Tellen
  • IsEmpty
  • Sleutels
  • Waarden
  • KopiërenNaar
  • ToArray

Other episodes