2017-12-28 11 views
0

Ich muss Elemente aus ConcurrentDictionary durch einige Schlüssel entfernen. Gefällt mir:Ist Keys-Sammlung in ConcurrentDictionary Thread sicher

Die Frage ist: Ich zähle die Schlüsselsammlung auf, wenn der Start Looping ist. Was, wenn jemand das Diktat gleichzeitig ändert? Gibt dict.Keys einen Snapshot zurück?

+1

Es erstellt eine Kopie zurück. Siehe [hier] (https://github.com/Microsoft/referencesource/blob/master/mscorlib/system/collections/Concurrent/ConcurrentDictionary.cs#L1931-L1955). – john

+1

Es gibt einen 'Schnappschuss' (also ja, es wird gut funktionieren). Ich würde vorschlagen, 'var keys = dict.Select (z => z.Key) zu verwenden. Wo (k => k.Name ==" Example ");' um die Notwendigkeit von Snapshots (dh Sperren) zu reduzieren - dh es wird im Allgemeinen schneller sein. Oder einfach "foreach" über das Wörterbuch wie im Duplikat. – mjwills

Antwort

3

Blick auf source code:

public ICollection<TKey> Keys 
{ 
    get { return GetKeys(); } 
} 

private ReadOnlyCollection<TKey> GetKeys() 
{ 
    int locksAcquired = 0; 
    try 
    { 
     AcquireAllLocks(ref locksAcquired); 

     int count = GetCountInternal(); 
     if (count < 0) throw new OutOfMemoryException(); 

     List<TKey> keys = new List<TKey>(count); 
     for (int i = 0; i < _tables._buckets.Length; i++) 
     { 
      Node current = _tables._buckets[i]; 
      while (current != null) 
      { 
       keys.Add(current._key); 
       current = current._next; 
      } 
     } 

     return new ReadOnlyCollection<TKey>(keys); 
    } 
    finally 
    { 
     ReleaseLocks(0, locksAcquired); 
    } 
} 

Er sperrt Sammlung und Rückgabe Kopieren von Schlüsseln

4

Alle öffentlichen und geschützten Mitglieder ConcurrentDictionary sind Thread-sicher und können gleichzeitig von mehreren Threads verwendet werden. Mitglieder, auf die über eine der Schnittstellen zugegriffen wird, die ConcurrentDictionary implementiert, einschließlich der Erweiterung Methoden, sind nicht garantiert Thread sicher und müssen möglicherweise vom Aufrufer synchronisiert werden.

von https://msdn.microsoft.com/en-us/library/dd287191(v=vs.110).aspx#Anchor_10