Ich habe eine Dictionary<string, someobject>
.
EDIT: Ich wurde darauf aufmerksam gemacht, dass mein Beispiel schlecht war. Meine Absicht war es nicht, die Referenzen in einer Schleife zu aktualisieren, sondern verschiedene Werte zu aktualisieren, je nachdem, welche Threads die Daten aktualisieren/abrufen müssen. Ich habe die Schleife in eine Methode geändert.
Ich brauche, um Elemente in meinem Wörterbuch zu aktualisieren - ein Schlüssel zu einer Zeit, und ich wunderte mich, wenn es irgendwelche Probleme bei der Verwendung der Sperre auf den Wert .key meines Dictionary-Objekts gibt?
private static Dictionary<string, MatrixElement> matrixElements = new Dictionary<string, MatrixElement>();
//Pseudo-code
public static void UpdateValue(string key)
{
KeyValuePair<string, MatrixElement> keyValuePair = matrixElements[key];
lock (keyValuePair.Key)
{
keyValuePair.Value = SomeMeanMethod();
}
}
Würde das vor Gericht Bestand haben oder scheitern? Ich möchte nur, dass jeder Wert im Wörterbuch unabhängig gesperrt wird, so dass das Sperren (und Aktualisieren) eines Wertes die anderen nicht sperrt. Auch ich bin mir bewusst, die Sperre wird für eine lange Zeit halten - aber die Daten werden ungültig sein, bis vollständig aktualisiert.
0 Stimmen
Keine Antwort, aber Sie wissen, dass Sie, wenn Sie das Paar bereits haben, pair.Value verwenden können, anstatt operator[] erneut im Dictionary aufzurufen?
0 Stimmen
Ich habe es versucht, aber der Wert ist schreibgeschützt, so hat es mir meine IDE gesagt.
0 Stimmen
Sie können die foreach-Elemente nicht ändern
0 Stimmen
Wo genau liegt die Gleichzeitigkeit, die Sie vermeiden wollen? Wenn Sie Ihre Schleife in mehreren Threads ausführen, sperrt der erste Thread die erste Taste, alle anderen blockieren beim Drücken der ersten Taste. Ich verstehe also das Szenario nicht, das Sie lösen wollen. Könnten Sie Ihre Frage in dieser Hinsicht präzisieren?
0 Stimmen
TToni: Sie haben absolut Recht, aber mein Beispiel hier ist vereinfacht - sie werden nicht in einer Schleife aktualisiert - es war nur ein schlechtes Beispiel, das ich gemacht habe - jeder Thread könnte unterschiedliche Werte aktualisieren - oder das Gleiche, was ich gerne vermeiden würde.
0 Stimmen
Nun, das ist der Grund, warum ich gefragt habe, um die Frage zu klären :-) Es gibt eine ganze Reihe von Diskussionen, die sich darauf konzentrieren, warum die Schleife nicht funktioniert, dass Sie jeden Enumerator der Sammlung ungültig machen, wenn Sie ihn aktualisieren und so weiter. Also, ja, schlechtes Beispiel, bitte wählen Sie ein besseres.
0 Stimmen
Ähnliche Frage: stackoverflow.com/questions/168249/