如何改进以下函数中的锁定过程?
此函数将站点每个页面的用户的 Web 套接字添加到静态字典的列表中
public void Add(TKey key, CustomServerWebSocket customWebSocket)
{
_customWebSocketsLock.EnterWriteLock();
try
{
if (!_customWebSockets.ContainsKey(key))
{
_customWebSockets.TryAdd(key, new CustomServerWebSockets());
}
_customWebSockets[key].Add(customWebSocket);
}
finally
{
_customWebSocketsLock.ExitWriteLock();
}
}
我认为这个条件完全是多余的,因为如果键已经存在,那么
TryAdd
方法将不会添加值 - 所以这根本没有意义。只需这样做:
private object _locker = new object();
public void Add(TKey key, CustomServerWebSocket customWebSocket)
{
lock(_locker)
{
_customWebSockets.TryAdd(key, customWebSocket);
}
}
话虽这么说,我远不是多线程编程方面的专家,但我知道有一个名为
System.Collections.Concurrent
的命名空间,其中包含线程安全集合,其中之一是调用 ConcurrentDictionary<TKey,TValue>
- 你可能应该考虑工作使用此类而不是 Dictionary<TKey,TValue>
。