J'ai eu un petit problème. Parfois, lorsque j'essaie d'appeler le code suivant, les méthodes remove lèvent une exception avec le message "la clé n'est pas présente dans le dictionnaire".C# exception: La clé n'est pas présente dans le dictionnaire
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);
}
}
La classe ARPHostEntry est un simple calss qui détient une-adresse IP et un associé MAC-Adresse où les deux fiels dans cette classe sont en lecture seule. Le programme est multithread, mais je verrouille les dictionnaires de cette classe chaque fois que je les utilise.
Je suis sans défense. Pourquoi cette exception existe-t-elle?
meilleures salutations
Modifier
Pour plus de précisions, la réponse acceptée est correcte. L'exception générée était un problème causé par l'accès inter-thread à mes dictionnaires.
O_O. D'accord, je vais vérifier à nouveau ceci. Étrange. Et je vais essayer de mettre à jour seulement la valeur. Merci. – Emiswelt
@Emiswelt: Dites-nous si cela fonctionne (ou pas). –
Je suis probablement un peu en retard mais je l'ai réparé comme vous l'avez suggéré. Avec un modèle multihtreading plus propre (ISyncrhonizeInvoke) dans la classe appelante, cela fonctionne maintenant. – Emiswelt