2013-07-29 10 views
19

Istnieją dwa sposoby przypisywania wartości do istniejącego klucza w współbieżnym słowniku w moim bieżącym projekcie.Słownik współbieżności AddOrUpdate vs Index Dodaj

A. concurrentDictionary1[key] = value;

i

B. concurrentDictionary2.AddOrUpdate(key, value, (k, v) => value);

Jeśli wiem, że istnieje 'klucz', są one funkcjonalnie równoważne?

Czy ochrona zapewniona jest przez współbieżność słownika równoczesnego pomijanego metodą "A"?

Jaka jest różnica? Jakie są powody wyboru jednego z nich?

Przeglądałem dokumentację w msdn i wygląda na to, że inicjują one słownik współbieżny z metodą "A", a nie aktualizują go.

Odpowiedz

8

Oba wywołują TryAddInternal, więc zachowują się dokładnie tak samo **.

Aktualizacja:

Jest inna różnica. Oto kod z indekser:

set 
{ 
    TValue tValue; 
    if (key == null) 
    { 
     throw new ArgumentNullException("key"); 
    } 
    this.TryAddInternal(key, value, true, true, out tValue); 
} 

porównaniu z metodą

while (!this.TryAddInternal(key, tValue, false, true, out tValue1)); 

Wygląda więc na to jest szansa, że ​​indekser zawiedzie cicho, podczas gdy metoda będzie nadal próbuje aż do skutku. Hmm, potrzebna będzie dogłębna analiza, aby w pełni zrozumieć różnice między tymi dwoma:/

Dekompilatory są nadal Twój przyjaciel.

** I derped.

+2

Ten 'concurrentDictionary1 [key] = value' nie wyrzuciłby wyjątku, jeśli klucz nie istnieje, zamiast tego doda go do słownika. – Habib

+0

@Habib: Yup. Odbicie od tego wyjątku:/naprawione. – Will

+1

To jest mój strach, wydaje się, że indeksator jest dobry do zainicjowania, ale może zadziałać nieoczekiwanie tam, gdzie wymagana jest współbieżność. – Bob2Chiv

0

Tak, równoważny. Indeksatory No. są w rzeczywistości metodami (takimi jak właściwości) i nie sądzę, aby pomijały współbieżność dla tego. metoda

+1

Metoda A nie wygeneruje wyjątku, jeśli klucz nie istnieje, zamiast tego doda go do słownika. – Habib

+0

o tak, wymieszałem to z normalnym Słownikiem. – TakeMeAsAGuest

+0

Cóż, to normalne zachowanie normalnego słownika. – Habib

1

Jeśli wiem, że "klucz" istnieje, czy są one równoważne funkcjonalnie?

Sposób, w jaki go używasz, tak. W rzeczywistości są one równoważne, czy istnieje key czy nie.

Jakie są powody wyboru jednego z nich?

AddOrUpdate przyjmuje funkcji być wykorzystane do aktualizacji tej wartości. Używasz go tylko do bezpośredniego ustawiania wartości, ale jest zaprojektowany do użycia w celu aktualizowania wartości w sposób współbieżny na podstawie wyniku działania funkcji. Na przykład:

concurrentDictionary2.AddOrUpdate(key, value, (k, v) => v + value); // adds value to the existing value 
11

To jest stare pytanie, ale nikt nie odpowiedział, dlaczego używałbyś jednego na drugim.

Wybierz opcję A (indeksator), jeśli chcesz dodać lub zaktualizować, a aktualizacja nie zależy od istniejącej wartości.

Wybierz opcję B (AddOrUpdate), jeśli chcesz dodać lub zaktualizować, a aktualizacja zależy od istniejącej wartości. AddOrUpdate dokona aktualizacji atomowo.

W tym przypadku w pytaniu chcesz użyć indeksu. Jest prostszy, łatwiejszy do odczytania i prawdopodobnie szybszy, ponieważ nie tworzysz anonimowej funkcji.