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>.Values
produceert 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:
Specifiek…..
Zonder slot:
- TryGetValue
- GetEnumerator
- De indexeerder
- BevatSleutel
Haalt elk slot uit (lockfull?):
- Tellen
- IsEmpty
- Sleutels
- Waarden
- KopiërenNaar
- ToArray