根据c#中的条件锁定对象

时间:2013-09-22 18:05:09

标签: c# .net multithreading locking

我需要根据变量或属性的值锁定一段代码。假设正在调用我的方法并传递UserData对象。

UserData contains two properties 

UserID and Marks

锁码目前就像

var l=new Object();
lock(l)
{
//Update marks of a particualr user id to UserData.Marks
}

现在它将锁定此方法的所有内容,假设它正在更新UserID = 1的标记,它仍将锁定其他用户ID的未来调用,我希望它锁定对该特定用户ID的请求正在访问锁,在这个案例用户1.其他应该自由移动。

我在想的是,而是创建一个新的锁定对象,为lock创建一个自定义类,其中包含User ID的属性。当请求到来时,我根据该特定值创建一个锁。我甚至不知道这是否可行。请指引我正确的方向。

1 个答案:

答案 0 :(得分:0)

您当前锁定的方式根本不会做任何事情,因为调用该函数的两个线程将创建两个单独的锁定对象,但是您声明“假设我的方法被调用并传递UserData对象。 “而且每个UserData对象都有IdMarks

这两个属性

如果确实如此,那么您需要做的就是锁定UserData个对象。

public void UpdateMarks(UserData userData)
{
    lock(userData)
    {
         //Do stuff to userData.Marks
    }
}

唯一需要注意的是,如果你在代码中有进一步锁定,可能依赖于其他锁定对象,你可能会让你自己陷入僵局。