改进 ASP.net core 中的锁定流程

问题描述 投票:0回答:1

如何改进以下函数中的锁定过程?

此函数将站点每个页面的用户的 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();
    }
}
c# multithreading asp.net-core .net-core locking
1个回答
0
投票

我认为这个条件完全是多余的,因为如果键已经存在,那么

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>

© www.soinside.com 2019 - 2024. All rights reserved.