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

时间:2013-04-04 12:11:48

标签: c# dictionary synchronization

我正在尝试在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)
{
    ....
}

还要提到我一直没有收到此错误。只是偶尔启动应用程序时。知道是什么原因引起的吗?我的同步方式是错误还是别的?

3 个答案:

答案 0 :(得分:5)

  1. 您的锁无效。您需要一个实例才能锁定。您目前每次都会创建一个新的。
  2. 请改用ConcurrentDictionary<TKey, TValue>并使用AddOrUpdate。这样就完全不需要锁定了:

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

答案 1 :(得分:1)

在类的范围内移动同步对象:

public class Test
{    
    private object syncRoot = new object();

    private void Foo()
    {
        lock (this.syncRoot)
        {
            ....
        }
    }
}

让它静止与否,取决于你如何使用你的课程。

答案 2 :(得分:1)

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