У меня есть куча сущностей БД, которые загружаются в объекты БД. Одна и та же сущность БД может быть загружена не только в объект БД. Периодически объект БД будет требовать специальной обработки. Эта обработка должна выполняться одним потоком за раз. Блокировка в порядке здесь.
РЕДАКТИРОВАТЬ: Важное примечание: процесс вызывает медленный веб-сервис. Это то, что я пытаюсь предотвратить параллелизмом. Я не понимаю, как это можно безопасно сделать без замков.
Поэтому я создаю объект «навесной замок», на который будут ссылаться объекты БД для блокировки. Объект висячего замка основан на объектах, поэтому два или более объектов БД для одного и того же объекта будут использовать один и тот же объект висячего замка. Я храню эти замки в объекте словаря, используя в качестве ключа идентификатор сущности БД. Объект замка также является простым строковым объектом. Это правильный подход? Я думаю, что я или над разработкой или упрощением этого. Если подход правильный, как выглядит этот код? Это работает, но я еще не тестировал его под нагрузкой.
Спасибо:)
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];
}