C# – 从字典中获取时锁定资源

我有一个跟踪对象的Dictionary(ClientObject)。 字典和ClientObject都由多个线程访问。 当我修改或读取此字典中的任何对象时,我使用ReaderWriterLockSlim(rwl_clients)在字典上获取读取或写入锁定,然后获取对实际对象的独占锁定。

我只是想知道我是否正确使用这些.net线程设施

例:

rwl_clients.EnterReadLock(); ClientObject clobj; if(!m_clients.TryGetValue(key, out clobj)) return; rwl_clients.ExitReadLock(); SomeMethod(clobj); 

SomeMethod(ClientObject clobj)会执行以下操作:

 lock(clobj) { /// Read / Write operations on clobj } 

从一个线程中的字典中获取和锁定值(ClientObject)是否意味着其他线程将尊重该锁定? 换句话说,.net将字典中的值视为单个资源(而不是副本),因此会尊重所有线程中该资源的锁定吗?

还有一个问题,当从字典中删除资源时 – 我应该在执行Remove()之前将其锁定

例:

 rwl_clients.EnterWriteLock(); ClientObject clobj; if(m_clients.TryGetValue(key, out clobj)) { lock(clobj) { m_clients.Remove(key); } } rwl_clients.ExitWriteLock(); 

我从这个网站上学到了很多,并感谢任何回复! 谢谢。

从一个线程中的字典中获取和锁定值(ClientObject)是否意味着其他线程将尊重该锁定? 换句话说,.net将字典中的值视为单个资源(而不是副本),因此会尊重所有线程中该资源的锁定吗?

它取决于类型 – 如果是引用类型则为yes,如果值类型为no。 这也是你永远不应该锁定值类型的原因,因为值类型将被装箱,并且任何后续锁定该值的尝试实际上将获取对另一个对象的锁定。

还有一个问题,当从字典中删除资源时 – 我应该在执行Remove()之前将其锁定

是的,您应该在任何改变对象状态的操作之前锁定。

作为旁注 – 您确定此设置是解决问题的最佳方案吗? 跨线程共享的可变对象往往会在解决后产生更多问题。

如果要在字典中添加或删除项目,请锁定字典。

将对象放入字典时,您将在字典中对该对象进行REFERENCE。 为了防止第一个线程在更改它时第二个线程更改该对象,请锁定该对象,而不是字典。