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

C# 在C中实现锁定的最佳方法#,c#,multithreading,synchronization,C#,Multithreading,Synchronization,我有一个用于访问SQL Server表的对象,请执行插入/更新 我有两个windows服务,它们使用同一个对象读/写同一个表 为了保持完整性,我在这个对象上使用了互斥锁和释放。但由于延迟获得同步错误(对象同步方法是从未同步的代码块调用的)。因此,我添加了一个bool来标识调用方(在下面的代码中,bool是threadownedLockaskingtorelease In'Release'方法)。这会解决同步问题吗?这是正确的方法吗 等级ST public ST() //constructo

我有一个用于访问SQL Server表的对象,请执行插入/更新

我有两个windows服务,它们使用同一个对象读/写同一个表

为了保持完整性,我在这个对象上使用了互斥锁和释放。但由于延迟获得同步错误(对象同步方法是从未同步的代码块调用的)。因此,我添加了一个bool来标识调用方(在下面的代码中,bool是threadownedLockaskingtorelease In'Release'方法)。这会解决同步问题吗?这是正确的方法吗

等级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();            
    }
}
类别服务1:

        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
        }
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
类别服务2:

        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
        }
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

为什么不直接使用默认的锁定命令呢?(锁{code}不,正确的方法是获取锁,然后释放。如果无法获取锁,为什么还要继续并运行查询?那么锁不是没有必要吗?我建议正确的方法是使用存储过程调用这些读写操作,并使用来自服务的SQL事务。不要使用任何共享对象b在服务和稍后应用同步之间,我认为在所有此类服务之间保持同步是一项繁琐的任务。您使用此共享对象而不是事务方法有什么具体原因吗?嗨,neo,我不知道为什么不首选事务,因为代码是由不在团队中的人编写的。嗨,Jurion,锁在对象构造函数(类ST)中使用。但是,据我所知,由于两个不同的进程(即windows服务-我的代码示例中的refer Service1和Servcie2)将使用相同的对象,所以使用互斥锁