J'ai un tas d'entités DB chargées dans des objets DB. La même entité de base de données peut être chargée dans plus d'un objet DB. Périodiquement, une entité DB nécessitera un traitement spécial. Ce traitement doit être effectué par un thread à la fois. Le verrouillage est en ordre ici.Objets de simultanéité, de verrouillage et de dictionnaire C#
EDIT: Remarque importante: le processus appelle un service Web lent. C'est ce que j'essaie d'empêcher la concurrence. Je ne vois pas comment cela peut se faire en toute sécurité sans verrous. Je crée donc un objet "cadenas" qui sera référencé par les objets DB pour le verrouillage. L'objet cadenas est basé sur l'entité de sorte que deux ou plusieurs objets DB pour la même entité utilisent le même objet cadenas. Je stocke ces cadenas dans un objet dictionnaire en utilisant l'ID de l'entité DB comme clé. L'objet cadenas est également un simple objet chaîne. Est-ce la bonne approche? Je pense que je suis soit sur l'ingénierie ou la simplification. Si l'approche est correcte, à quoi ressemble ce code? Cela fonctionne, mais je n'ai pas encore testé sous charge.
Merci de
public static func(CustomObject o)
{
if (ReadyForUpdate(o))
{
lock (LookupPadLockByID(object.ID)
{
if (ReadyForUpdate(o))
{
PerformUpdate(object);
}
}
}
}
private static readonly object padlockLock = new object();
private static readonly Dictionary<int, string> padLocks = new Dictionary<int,string>();
private static object LookupPadLockByID(int uniqueID)
{
lock (padlockLock)
{
if (!padLocks.ContainsKey(uniqueID))
{
padLocks.Add(uniqueID, uniqueID + " is locked");
}
}
return padLocks[uniqueID];
}
La méthode PeformUpdate appelle un service Web très lent, puis effectue une mise à jour de base de données.C'est ce dont j'ai besoin pour empêcher la concurrence. –