2013-04-04 101 views
1

我想添加一些元素到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) 
{ 
    .... 
} 

另外不得不提的是,我没有得到这个错误所有的时间。只是偶尔在启动应用程序时。任何想法可能会造成这种情况?我是在做同步错误还是其他什么?

回答

5
  1. 您的锁无效。您需要有一个实例锁定。您目前每次都创建一个新的。
  2. 改为使用ConcurrentDictionary<TKey, TValue>并使用AddOrUpdate。这完全消除了对锁的需要:

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

@ShellShock:我知道。你评论我的答案的旧版本。 – 2013-04-04 12:17:47

+0

更多挑剔:lockObject应该具有与Dictionary相同的作用域和生命周期。 – 2013-04-04 12:20:23

+0

非常感谢您的回答。什么是正确的锁定方式?我还需要这个代码的其他部分?谢谢! – zzirna 2013-04-04 12:42:53

1

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

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

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

让它静态与否,取决于你如何使用你的类。

+0

谢谢大家!我们都很帮忙! – zzirna 2013-04-04 12:56:41

相关问题