2013-04-04 104 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

相關問題