2009-10-18 26 views
0

我遇到了一些問題。有時,當我嘗試調用下面的代碼時,remove方法會拋出一個異常,並顯示消息「該密鑰不在字典中」。C#異常:密鑰在字典中不存在

private Dictionary<IPAddress, ARPHostEntry> dIPHostTable; 
private Dictionary<MACAddress, ARPHostEntry> dMACHostTable; 

public HostTable() 
{ 
    dIPHostTable = new Dictionary<IPAddress, ARPHostEntry>(); 
    dMACHostTable = new Dictionary<MACAddress, ARPHostEntry>(); 
} 

public void AddHost(ARPHostEntry arphEntry) 
{ 
    lock (dMACHostTable) 
    { 
     if (dMACHostTable.ContainsKey(arphEntry.MAC)) 
     { 
      dMACHostTable.Remove(arphEntry.MAC); 
     } 
     dMACHostTable.Add(arphEntry.MAC, arphEntry); 
    } 
    lock (dIPHostTable) 
    { 
     if (dIPHostTable.ContainsKey(arphEntry.IP)) 
     { 
      dIPHostTable.Remove(arphEntry.IP); 
     } 
     dIPHostTable.Add(arphEntry.IP, arphEntry); 
    } 
} 

類ARPHostEntry是一個簡單的CALSS保持的IP地址和相關聯的MAC-地址在這個類既fiels是隻讀的。 該程序是多線程的,但每當我使用它時,都會鎖定該類中的字典。

我很無奈。爲什麼會出現這種例外情況?

與問候

編輯

爲了澄清,公認的答案是正確的。生成的異常是由跨線程訪問我的字典引起的問題。

回答

2

Remove方法不應該拋出這樣的異常,它應該返回false如果沒有找到鍵(見here)。 而不是刪除和添加,你爲什麼不嘗試更新密鑰的值?

+0

O_O。 好的,我會重新檢查一下。 奇怪。 我會嘗試只更新值。謝謝。 – Emiswelt

+0

@Emiswelt:讓我們知道它是否有效(或不)。 –

+0

我可能有點晚了,但我按照你的建議修復了它。與調用類中的清潔多線程模型(ISyncrhonizeInvoke)一起,它現在可以工作。 – Emiswelt

0

從你的例子中,你是否真的在線程間共享主表是不清楚的。私人主機表不應該是靜態的嗎?

+0

不,我需要這個類的多個實例用於多個網絡接口,這些接口與許多其他對象實現的更高層和許多線程共享。 – Emiswelt

相關問題