Ich versuche, Einträge in einem ConcurrentDictionary etwas wie folgt zu aktualisieren:
%Vor%Im Wesentlichen muss ich über das Wörterbuch iterieren und ein Feld auf jedem Wert aktualisieren. Aus der Dokumentation geht hervor, dass ich die Value-Eigenschaft vermeiden muss. Stattdessen denke ich, dass ich TryUpdate verwenden muss, außer dass ich nicht mein gesamtes Objekt ersetzen möchte. Stattdessen möchte ich ein Feld auf dem Objekt aktualisieren.
Nach dem Lesen von diesem Blogeintrag im Blog des PFX-Teams: Vielleicht muss ich AddOrUpdate verwenden und einfach nichts in den Add Delegate tun.
Hat jemand einen Einblick, wie man das macht?
Ich habe Zehntausende von Objekten im Wörterbuch, die ich alle 30 Sekunden aktualisieren muss. Es ist wahrscheinlich nicht machbar, neue zu erstellen, um die Eigenschaft zu aktualisieren. Ich müsste das vorhandene Objekt klonen, es aktualisieren und das im Wörterbuch ersetzen. Ich müsste es auch für die Dauer des Clone / Add-Zyklus sperren. Yuck.
Was ich tun möchte, ist, über die Objekte zu iterieren und die Counter-Eigenschaft direkt zu aktualisieren, wenn möglich.
Meine neuesten Forschungen haben mich zu Parallel.ForEach geführt, was großartig klingt, aber es sollte nicht für Aktionen verwendet werden, die den Status aktualisieren.
Ich habe auch erwähnt, dass Interlocked.Increment großartig klingt, aber ich muss immer noch herausfinden, wie man es für jedes Element in meinem Wörterbuch threadsicher verwendet.
Erstens, um Ihr Sperrproblem zu lösen:
%Vor%Das Iterieren der gerechten Werte sollte schneller sein als das Iterieren des Schlüsselwertpaars. [Obwohl ich denke, dass das Iterieren einer Liste von Schlüsseln und das Durchführen von Suchvorgängen in den meisten Situationen noch schneller im ConcurrentDictionary sein wird.]
%Vor%ConcurrentDictionary hilft Ihnen nicht beim Zugriff auf Elemente von gespeicherten Werten gleichzeitig, nur mit den Elementen selbst.
Wenn mehrere Threads TestIt aufrufen, sollten Sie eine Momentaufnahme der Auflistung erstellen und die freigegebenen Ressourcen (die die einzelnen Wörterbuchwerte sind) sperren:
%Vor%Wenn Sie jedoch den Zähler für einen bestimmten Schlüssel aktualisieren möchten, können Sie mit ConcurrentDictionary ein neues Schlüsselwertpaar hinzufügen, wenn der Schlüssel nicht existiert:
%Vor%AddOrUpdate und TryUpdate sind tatsächlich für Fälle, in denen Sie den Wert für einen bestimmten Schlüssel in einem ConcurrentDictionary ersetzen möchten. Aber, wie Sie sagten, Sie möchten den Wert nicht ändern, Sie möchten eine Eigenschaft des Wertes ändern.
Tags und Links c# .net-4.0 concurrency