問題描述:在用foreach遍歷hashtable的時候,彈出“集合已修改;可能無法執行枚舉操作。”
問題代碼:
private void Check(int TimeOut) //這是一個存活檢查線程,爲了把連接失效的主機剔除
{
DateTime t = DateTime.Now;//取出當前的時間
//Hashtable
foreach (DictionaryEntry item in _transmit_tb)//彈出“集合已修改;可能無法執行枚舉操作。”
{
if ((t - (DateTime)Time[item.Key]).Seconds > TimeOut)
{
LogOut(item.Key);
//此函數的作用是剔除失效的主機
}
}
}
解決方法:利用for進行遍歷。
ArrayList akeys=new ArrayList(_transmit_tb.Keys);
for(int p=akeys.Count-1;p> -1;p--)
{
_transmit_tb.Remove(akeys[p]);
}
原因:
1、hashtable存放你放入的值的時候 不是按照你存放順序放的
所以當你用foreach遍歷的時候 就不能保證遍歷出來的順序和你原來存放進去的順序是一致的
2、msdn的解釋:foreach 語句是對枚舉數的包裝,它只允許從集合中讀取,不允許寫入集合。
也就是,不能在foreach裏遍歷的時侯把它的元素進行刪除或增加的操作的
部分內容參考:http://topic.csdn.net/t/20050412/21/3931090.html
另外附上一篇:集合遍歷時刪除和增加元素