【发布时间】:2009-01-13 21:52:48
【问题描述】:
我有一堆加载到数据库对象中的数据库实体。同一个 DB 实体可能被加载到多个 DB 对象中。数据库实体会定期需要特殊处理。该处理必须由一个线程一次执行。锁定在这里是有序的。
编辑:重要提示:该进程调用慢速 Web 服务。这就是我试图防止并发的原因。我不明白如何在没有锁的情况下安全地完成此操作。
所以我创建了一个“挂锁”对象,数据库对象将引用该对象进行锁定。挂锁对象是基于实体的,因此同一实体的两个或多个 DB 对象将使用相同的挂锁对象。我将这些挂锁存储在一个字典对象中,使用 DB 实体的 ID 作为键。挂锁对象也只是一个简单的字符串对象。这是正确的方法吗?我在想我要么过度工程化,要么简化了这个。如果方法是正确的,这段代码看起来如何?它可以工作,但我还没有在负载下对其进行测试。
谢谢:)
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];
}
【问题讨论】:
-
PeformUpdate 方法调用一个非常慢的 Web 服务,然后进行数据库更新。这是我防止并发所需要的。
标签: c# concurrency dictionary locking