Utilisez la fonction de verrouillage sur la clé d'un Dictionnaire<string, object>

J'ai un Dictionary<string, someobject>.

EDIT: Il m'a été signalé, que mon exemple était mauvais. Tout mon intention n'était pas de mettre à jour les références dans une boucle, mais la mise à jour des valeurs différentes nationalités différentes threads ont besoin de mise à jour/obtenir les données. J'ai changé la boucle à une méthode.

J'ai besoin de mettre à jour des éléments dans mon dictionnaire - une clé à un moment et je me demandais s'il y a des problèmes dans l'utilisation de la serrure de la .valeur de la clé de mon Dictionnaire d'objet?

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();
    }
}

Serait-ce hold-up dans la cour ou d'échouer? Je veux juste chaque valeur dans le dictionnaire pour être verrouillé indépendamment donc de verrouillage (et mise à jour) d'une valeur ne permet pas de verrouiller les autres. Aussi, je suis conscient que le verrouillage d'être tenue pour une longue période de temps - mais les données ne seront pas valides jusqu'à ce jour pleinement.

Pas une réponse, mais que vous savez que si vous disposez déjà de la paire, vous pouvez utiliser la paire.La valeur au lieu d'appeler l'opérateur[] à nouveau sur le Dictionnaire?
En fait j'ai essayé, mais la Valeur est en lecture seule ou si mon IDE m'a dit?
vous ne pouvez pas modifier foreach éléments
Où, exactement, est la simultanéité vous voulez éviter? Si vous exécutez votre boucle dans plusieurs threads, la première fois pour verrouiller la première clé, toutes les autres vont bloquer sur la frappe de la première clé. Donc je ne comprends pas la scneario que vous souhaitez résoudre. Pourriez-vous préciser votre question?
TToni: Vous avez absolument raison, mais mon exemple ici est simplifié - ils ne seront pas mis à jour dans une boucle, c'était juste un mauvais exemple, j'ai fait - chaque thread peut mettre à jour des valeurs différentes - ou même que je voudrais éviter.

OriginalL'auteur Per Hornshøj-Schierbeck | 2008-10-01