在C#上锁定以防止多个线程或事件使用相同的变量值

sof*_*ter 0 c# locking

我想从sql中释放我的应用程序,因为我没有大型数据库.我想把我的数据保存在内存中,所以我的应用程序运行得更快.

我的问题是我有一个密钥池,只有4个客户端可以使用密钥,我想在每个密钥注册到客户端时将其锁定,所以我将使用:

lock(key)
{
  assignKeyToClient(clientId);
}
Run Code Online (Sandbox Code Playgroud)

如果我使用它,会锁定使用密钥的副本还是锁定ram上的原始"密钥"并在完成分配后释放它?

谢谢!

Bro*_*ass 6

我认为您对该lock语句的含义感到困惑- 它仅用于并发管理 - 它确保它所保护的代码部分("关键部分")一次只能由一个线程输入.

这与用户数据无关,即客户端ID或密钥.要管理唯一的客户端ID,您可以使用类似的东西Dictionary.当您指定密钥时,只有在执行此部分代码的多个线程时才应使用锁.如果是这种情况,请使用私有只读对象变量来锁定类实例,以确保只分配一次相同的键:

private readonly object myLock = new object();
private Dictionary<int> assignedKeys = new Dictionary<int>();
...

lock(myLock)
{
  int key = PickAKeyHere();
  AssignKeyToClient(key, clientId);
  assignedKeys[key] = clientId; //keep track of which client is assigned what key 
}
Run Code Online (Sandbox Code Playgroud)