1

変数またはプロパティの値に基づいてコードをロックする必要があります。私のメソッドが呼び出されていると仮定し、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 の今後の呼び出しは引き続きロックされます。ロック、この場合はユーザー 1. その他は自由に移動する必要があります。

私が考えていたのは、ロック用の新しいオブジェクトを作成するのではなく、ユーザー ID のプロパティを含むロック用のカスタム クラスを作成することです。リクエストが来ると、その特定の値に基づいてロックを作成します。これが可能かどうかさえわかりません。親切に私を正しい方向に導いてください。

4

1 に答える 1

1

関数を呼び出す2つのスレッドが2つの個別のロックオブジェクトを作成するため、現在ロックしている方法はまったく何もしませんが、「私のメソッドが呼び出されていると仮定し、UserDataオブジェクトを渡すと仮定します。」また、各UserDataオブジェクトには2つしかないIdとのプロパティMarks

その場合は、そのUserDataオブジェクトをロックするだけです。

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

注意すべき唯一のことは、他のロック オブジェクトに依存する可能性のあるコード内にさらにロックがある場合、デッドロック状態に陥る可能性があるということです。

于 2013-09-22T18:19:38.040 に答える