我有一个用于访问SQL Server表的对象,执行插入/更新。
我有两个Windows服务,它们使用相同的对象来读/写同一个表。
为了保持完整性,我在这个对象上使用Mutex锁定和释放。但是后期获得同步错误(从非同步代码块调用了对象同步方法)。因此,我添加了一个bool来识别调用者(在下面的代码中,bool isThreadOwnedLockAskingToRelease在' Release'方法中)。这会解决同步问题,这是正确的方法吗?
Class ST
public ST() //constructor
{
Mutex stBusy = utils.GetMutex(@"ST");
bool lockAcquired = false;
lock (ex)
{
//open connection
// build dataset
// close conn
}
}
// ...
public bool Lock(string nameOfLock)
{
if (stBusy != null)
{
if (stBusy.WaitOne(2000))
{
lockAcquired = true;
//...
}
}
return lockAcquired;
}
public void Release(string NameOfUnlocker, bool isThreadOwnedLockAskingToRelease)
{
if (stBusy != null && isThreadOwnedLockAskingToRelease)
{
stBusy.ReleaseMutex();
}
}
Class Service1:
ST st;
bool smlock = st.Lock("STLock");
if (smlock)
{
st = new ST(); // construct object
// do work
st.Release("STLock",smlock); // 2nd param added to identify the locker
}
班级服务2:
ST st1;
bool lockOwner = st1.Lock("QM");
st1= new StatusTable();
//Do work
// Unlock the status table
st1.Release("QM", lockOwner); // Addl. parameter added to fix sync issue