在字典中“已经添加了具有相同键的项”

本文关键字:字典 添加 | 更新日期: 2023-09-27 18:07:26

我正试图在c#中添加一些元素到字典中,但我一直遇到一些问题。我是c#开发的新手,所以我希望有人能帮助我。

添加元素的代码为:
if (!connections.ContainsKey(port.getParentName()))
{
    connections.Add(port.getParentName(), port.getLabel() + ";" + cable + ";" + cableTemplate + "|");
}
else
{
    connections[port.getParentName()] += port.getLabel() + ";" + cable + ";" + cableTemplate + "|";
}

虽然我正在检查键是否已经包含在我的端口字典中,但我得到:

“An item with the same key has already been added”

还必须提到,我正在异步获取数据,所以我猜这是一个同步问题。我试图通过锁定这个代码块来处理这个问题,但这似乎并没有解决问题:

System.Object lockThis = new System.Object();
lock (lockThis)
{
    ....
}

还必须提到,我不是一直得到这个错误。只是在启动应用程序时偶尔会这样。知道是什么引起的吗?是我做同步的方式不对,还是有别的问题?

在字典中“已经添加了具有相同键的项”

    您的锁无效。您需要有一个实例来锁定。
  1. 使用ConcurrentDictionary<TKey, TValue>代替AddOrUpdate。这样就完全不需要锁了:

    var value = port.getLabel() + ";" + cable + ";" + cableTemplate + "|";
    connections.AddOrUpdate(port.getParentName(), value, (k, v) => v + value);
    

将同步对象移到类的作用域中:

public class Test
{    
    private object syncRoot = new object();
    private void Foo()
    {
        lock (this.syncRoot)
        {
            ....
        }
    }
}

将其设置为静态或非静态,这取决于您如何使用您的类。

ConcurrentDictionary可以为您处理同步问题。