Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 基于c中的条件锁定对象#_C#_.net_Multithreading_Locking - Fatal编程技术网

C# 基于c中的条件锁定对象#

C# 基于c中的条件锁定对象#,c#,.net,multithreading,locking,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的未来调用,我希望

我需要根据变量或属性的值锁定一段代码。假设正在调用我的方法并传递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的请求,在本例中是User 1。其他人应该自由行动


我的想法是,创建一个新的锁对象,创建一个包含用户ID属性的自定义锁类。当请求到来时,我会基于该特定值创建一个锁。我甚至不知道这是否可能。请指导我正确的方向。

您当前锁定的方式根本不起任何作用,因为调用函数的两个线程将创建两个单独的锁定对象,但是您声明“假设正在调用我的方法并传递UserData对象。”而且每个
UserData
对象只具有
Id
Marks

如果这是真的,那么您所需要做的就是锁定
UserData
对象

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

唯一需要注意的是,如果代码中有更多的锁,这些锁可能依赖于其他锁对象,那么您可能会陷入死锁状态。

您不应该创建这样的锁对象。如果这个方法被更多的线程使用,它们中的每一个都会创建一个用于锁定的对象,同步将无法工作。使用静态只读对象锁定器=新对象()改为在类中。Id和标记是什么类型?@OndrejJanacek
locker
只有在同步静态成员时才必须是静态的。对于实例成员,它必须是实例变量。否则,不必要的同步将在两个独立的instances@SriramSakthivel好的,谢谢你。我不知道。用户id,用户id,用户id和用户。准确点。显示更新。从你的答案我有一个想法,我不知道这是正确的还是错误的。有可能在lock语句之前,我可以创建一个新对象并将UserData.ID设置为该对象,然后将该对象用作锁。它可能有助于我锁定类似ID的目的,因为我锁定了整个UserData对象,我知道标记总是不同的,所以它可能会一直创建一个新锁。