在C#中实现锁定的最佳方法

时间:2016-03-01 06:19:32

标签: c# multithreading synchronization

我有一个用于访问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

0 个答案:

没有答案