2013-07-29 7 views
19

Es gibt zwei Möglichkeiten, die ich einem vorhandenen Schlüssel in einem gleichzeitigen Wörterbuch in meinem aktuellen Projekt Werte zugewiesen habe.Concurrent Dictionary AddOrUpdate vs Index Hinzufügen

A. concurrentDictionary1[key] = value;

und

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

Wenn ich weiß, dass der 'Schlüssel' vorhanden ist, sind diese funktional äquivalent?

Wird der Schutz durch die Parallelität des Concurrent Dictionary mit der Methode 'A' umgangen?

Was ist der Unterschied hier? Was sind die Gründe dafür, sich gegenseitig zu wählen?

Ich sah in der Dokumentation msdn, und es scheint, dass sie nur ein Concurrent-Wörterbuch mit der Methode 'A' initialisieren, nicht aktualisieren.

Antwort

8

Sie rufen beide TryAddInternal, so verhalten sich genau die gleichen **.

Aktualisierung:

Es gibt einen anderen Unterschied. Hier ist der Code aus dem Indexer:

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

gegen von der Methode

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

So scheint es eine Chance, dass der Indexer leise ausfällt, während das Verfahren versucht wird fortgesetzt, bis es gelingt. Hmm, eine tiefer gehende Analyse wäre erforderlich, um die Unterschiede zwischen den beiden zu verstehen:/

Decompilers sind immer noch Ihr Freund.

** Ich durped.

+2

Dieses 'concurrentDictionary1 [key] = value' würde keine Ausnahme auslösen, wenn der Schlüssel nicht existiert, stattdessen wird es dem Wörterbuch hinzugefügt. – Habib

+0

@Habib: Ja. Überspringe die Ausnahme genau:/behoben. – Will

+1

Dies ist meine Angst, es scheint, dass der Indexer gut für die Initialisierung ist, aber möglicherweise unerwartet dort agiert, wo Gleichzeitigkeit tatsächlich benötigt wird. – Bob2Chiv

0

Ja gleichwertig. Nr. Indexer sind eigentlich Methoden (wie Eigenschaften sind) und ich glaube nicht, dass sie Nebenläufigkeit dafür umgehen. Methode

+1

Methode A wird keine Ausnahme auslösen, wenn der Schlüssel nicht existiert, stattdessen wird sie dem Wörterbuch hinzugefügt. – Habib

+0

oh ja ive mischte es mit normalem Wörterbuch. – TakeMeAsAGuest

+0

Nun, das ist das normale Verhalten des normalen Wörterbuchs. – Habib

1

Wenn ich weiß, dass der "Schlüssel" existiert, sind diese funktional gleichwertig?

Die Art, wie Sie es verwenden, ja. In der Tat sind sie gleichwertig, ob key existiert oder nicht.

Was sind die Gründe dafür, sich für eines zu entscheiden?

AddOrUpdate akzeptiert eine Funktion verwendet werden, um den Wert zu aktualisieren. Sie verwenden es nur, um den Wert direkt festzulegen, aber es dient dazu, den Wert auf Grundlage des Ergebnisses einer Funktion gleichzeitig zu aktualisieren. Zum Beispiel:

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

Dies ist eine alte Frage, aber niemand antwortete, warum Sie eine über die andere verwenden würden.

Wählen Sie A (den Indexer), wenn Sie hinzufügen oder aktualisieren möchten und die Aktualisierung nicht vom vorhandenen Wert abhängig ist.

Wählen Sie B (AddOrUpdate), wenn Sie hinzufügen oder aktualisieren möchten und die Aktualisierung von einem vorhandenen Wert abhängt. AddOrUpdate führt die Aktualisierung automatisch durch.

Also in dem Fall in der Frage möchten Sie den Indexer verwenden. Es ist einfacher, einfacher zu lesen und wahrscheinlich schneller, da Sie keine anonyme Funktion erstellen.

Verwandte Themen